Mercurial > hg
annotate mercurial/dirstate.py @ 50520:0558866957fa
stream-clone: bail-out earlier if destination repo is not empty
The `canperformstreamclone` function is bit messy. However it seems clearer to
me to process the very generic condition about "can we consider a stream-clone
at all", before checking if a stream-clone is requested and if a compatible
protocol can be negotiated with the server.
So I am doing some gratuitous movement so reorder conditional.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Sat, 20 May 2023 01:17:27 +0200 |
parents | c5e93c915ab6 |
children | 18c8c18993f0 |
rev | line source |
---|---|
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
1 # dirstate.py - working directory tracking for mercurial |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
46794
diff
changeset
|
3 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com> |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
4 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # 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
|
7 |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
8 |
27670
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
9 import collections |
32346
73e67c4386ec
dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents:
32208
diff
changeset
|
10 import contextlib |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
11 import os |
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
12 import stat |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
13 import uuid |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
14 |
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
15 from .i18n import _ |
43090
1f339b503a40
py3: manually import pycompat.delattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
16 from .pycompat import delattr |
43239
6fcdcea2b03a
dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
17 |
6fcdcea2b03a
dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
18 from hgdemandimport import tracing |
6fcdcea2b03a
dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
19 |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
20 from . import ( |
47501
8b7e47802deb
dirstate: split dirstatemap in its own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47489
diff
changeset
|
21 dirstatemap, |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
22 encoding, |
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
23 error, |
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
24 match as matchmod, |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
25 node, |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
26 pathutil, |
32372
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32352
diff
changeset
|
27 policy, |
30304
ba2c04059317
py3: use pycompat.ossep at certain places
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30224
diff
changeset
|
28 pycompat, |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
29 scmutil, |
50256
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
30 txnutil, |
27503
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
31 util, |
0f4596622273
dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27399
diff
changeset
|
32 ) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
33 |
48260
269ff8978086
dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents:
48252
diff
changeset
|
34 from .dirstateutils import ( |
269ff8978086
dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents:
48252
diff
changeset
|
35 timestamp, |
269ff8978086
dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents:
48252
diff
changeset
|
36 ) |
269ff8978086
dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents:
48252
diff
changeset
|
37 |
42927
d459cd8ea42d
interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents:
42755
diff
changeset
|
38 from .interfaces import ( |
d459cd8ea42d
interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents:
42755
diff
changeset
|
39 dirstate as intdirstate, |
d459cd8ea42d
interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents:
42755
diff
changeset
|
40 util as interfaceutil, |
d459cd8ea42d
interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents:
42755
diff
changeset
|
41 ) |
d459cd8ea42d
interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents:
42755
diff
changeset
|
42 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43505
diff
changeset
|
43 parsers = policy.importmod('parsers') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43505
diff
changeset
|
44 rustmod = policy.importrust('dirstate') |
32372
df448de7cf3b
parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32352
diff
changeset
|
45 |
50266
307c155e6275
dirstate: deprecate calling `setbranch` without a transaction parameter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50256
diff
changeset
|
46 # use to detect lack of a parameter |
307c155e6275
dirstate: deprecate calling `setbranch` without a transaction parameter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50256
diff
changeset
|
47 SENTINEL = object() |
307c155e6275
dirstate: deprecate calling `setbranch` without a transaction parameter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50256
diff
changeset
|
48 |
48235
5c567aca080d
dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48223
diff
changeset
|
49 HAS_FAST_DIRSTATE_V2 = rustmod is not None |
5c567aca080d
dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48223
diff
changeset
|
50 |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
51 propertycache = util.propertycache |
16201
fb7c4c14223f
dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents:
16200
diff
changeset
|
52 filecache = scmutil.filecache |
47521
abed645b8e96
dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47517
diff
changeset
|
53 _rangemask = dirstatemap.rangemask |
16201
fb7c4c14223f
dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents:
16200
diff
changeset
|
54 |
48044
d5528ac9b4f2
dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
48019
diff
changeset
|
55 DirstateItem = dirstatemap.DirstateItem |
21808
7537e57f5dbd
dirstate: add dirstatetuple to create dirstate values
Siddharth Agarwal <sid0@fb.com>
parents:
21116
diff
changeset
|
56 |
47482
cb29484eaade
dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47481
diff
changeset
|
57 |
16201
fb7c4c14223f
dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents:
16200
diff
changeset
|
58 class repocache(filecache): |
fb7c4c14223f
dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents:
16200
diff
changeset
|
59 """filecache for files in .hg/""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
60 |
16201
fb7c4c14223f
dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents:
16200
diff
changeset
|
61 def join(self, obj, fname): |
fb7c4c14223f
dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents:
16200
diff
changeset
|
62 return obj._opener.join(fname) |
4610 | 63 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
64 |
16202
53e2cd303ecf
dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents:
16201
diff
changeset
|
65 class rootcache(filecache): |
53e2cd303ecf
dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents:
16201
diff
changeset
|
66 """filecache for files in the repository root""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
67 |
16202
53e2cd303ecf
dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents:
16201
diff
changeset
|
68 def join(self, obj, fname): |
53e2cd303ecf
dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents:
16201
diff
changeset
|
69 return obj._join(fname) |
53e2cd303ecf
dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents:
16201
diff
changeset
|
70 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
71 |
50118
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
72 def check_invalidated(func): |
50156
7e6c5cfaba6a
dirstate: phase-divergent update to 65943224c184
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50155
diff
changeset
|
73 """check that the func is called with a non-invalidated dirstate |
50118
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
74 |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
75 The dirstate is in an "invalidated state" after an error occured during its |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
76 modification and remains so until we exited the top level scope that framed |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
77 such change. |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
78 """ |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
79 |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
80 def wrap(self, *args, **kwargs): |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
81 if self._invalidated_context: |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
82 msg = 'calling `%s` after the dirstate was invalidated' |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
83 msg %= func.__name__ |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
84 raise error.ProgrammingError(msg) |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
85 return func(self, *args, **kwargs) |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
86 |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
87 return wrap |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
88 |
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
89 |
49963
23b70ce09e55
dirstate: rename `@requires_parents_change` to `@requires_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49962
diff
changeset
|
90 def requires_changing_parents(func): |
47592
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
91 def wrap(self, *args, **kwargs): |
50022
e333cc169c45
dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50021
diff
changeset
|
92 if not self.is_changing_parents: |
49961
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
93 msg = 'calling `%s` outside of a changing_parents context' |
47592
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
94 msg %= func.__name__ |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
95 raise error.ProgrammingError(msg) |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
96 return func(self, *args, **kwargs) |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
97 |
50118
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
98 return check_invalidated(wrap) |
47592
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
99 |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
100 |
50060
4f758b51bf9b
dirstate: enforce the use of `changing_files` context to change tracking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50026
diff
changeset
|
101 def requires_changing_files(func): |
4f758b51bf9b
dirstate: enforce the use of `changing_files` context to change tracking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50026
diff
changeset
|
102 def wrap(self, *args, **kwargs): |
4f758b51bf9b
dirstate: enforce the use of `changing_files` context to change tracking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50026
diff
changeset
|
103 if not self.is_changing_files: |
4f758b51bf9b
dirstate: enforce the use of `changing_files` context to change tracking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50026
diff
changeset
|
104 msg = 'calling `%s` outside of a `changing_files`' |
47592
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
105 msg %= func.__name__ |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
106 raise error.ProgrammingError(msg) |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
107 return func(self, *args, **kwargs) |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
108 |
50118
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
109 return check_invalidated(wrap) |
47592
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
110 |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
111 |
50108
f7981f202b7a
dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50106
diff
changeset
|
112 def requires_changing_any(func): |
f7981f202b7a
dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50106
diff
changeset
|
113 def wrap(self, *args, **kwargs): |
f7981f202b7a
dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50106
diff
changeset
|
114 if not self.is_changing_any: |
f7981f202b7a
dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50106
diff
changeset
|
115 msg = 'calling `%s` outside of a changing context' |
f7981f202b7a
dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50106
diff
changeset
|
116 msg %= func.__name__ |
f7981f202b7a
dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50106
diff
changeset
|
117 raise error.ProgrammingError(msg) |
f7981f202b7a
dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50106
diff
changeset
|
118 return func(self, *args, **kwargs) |
f7981f202b7a
dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50106
diff
changeset
|
119 |
50118
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
120 return check_invalidated(wrap) |
50108
f7981f202b7a
dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50106
diff
changeset
|
121 |
f7981f202b7a
dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50106
diff
changeset
|
122 |
50152
e9379b55ed80
dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50149
diff
changeset
|
123 def requires_changing_files_or_status(func): |
47593
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
124 def wrap(self, *args, **kwargs): |
50152
e9379b55ed80
dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50149
diff
changeset
|
125 if not (self.is_changing_files or self._running_status > 0): |
e9379b55ed80
dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50149
diff
changeset
|
126 msg = ( |
e9379b55ed80
dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50149
diff
changeset
|
127 'calling `%s` outside of a changing_files ' |
e9379b55ed80
dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50149
diff
changeset
|
128 'or running_status context' |
e9379b55ed80
dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50149
diff
changeset
|
129 ) |
47593
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
130 msg %= func.__name__ |
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
131 raise error.ProgrammingError(msg) |
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
132 return func(self, *args, **kwargs) |
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
133 |
50118
65943224c184
dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50117
diff
changeset
|
134 return check_invalidated(wrap) |
47593
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
135 |
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
136 |
50024
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
137 CHANGE_TYPE_PARENTS = "parents" |
50026
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
138 CHANGE_TYPE_FILES = "files" |
50024
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
139 |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
140 |
42927
d459cd8ea42d
interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents:
42755
diff
changeset
|
141 @interfaceutil.implementer(intdirstate.idirstate) |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48922
diff
changeset
|
142 class dirstate: |
50123
4e95341c89aa
dirstate: distinct transaction callback from largefile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50122
diff
changeset
|
143 |
50157
fbb4c7117cf1
dirstate: phase-divergent update to 4e95341c89aa
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50156
diff
changeset
|
144 # used by largefile to avoid overwritting transaction callback |
50123
4e95341c89aa
dirstate: distinct transaction callback from largefile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50122
diff
changeset
|
145 _tr_key_suffix = b'' |
4e95341c89aa
dirstate: distinct transaction callback from largefile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50122
diff
changeset
|
146 |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
147 def __init__( |
47280
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
148 self, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
149 opener, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
150 ui, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
151 root, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
152 validate, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
153 sparsematchfn, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
154 nodeconstants, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
155 use_dirstate_v2, |
48793
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
156 use_tracked_hint=False, |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
157 ): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
158 """Create a new dirstate object. |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
159 |
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
160 opener is an open()-like callable that can be used to open the |
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
161 dirstate file; root is the root of the directory tracked by |
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
162 the dirstate. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
163 """ |
47280
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
164 self._use_dirstate_v2 = use_dirstate_v2 |
48793
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
165 self._use_tracked_hint = use_tracked_hint |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
166 self._nodeconstants = nodeconstants |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
167 self._opener = opener |
13032
e41e2b79883d
dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents:
12907
diff
changeset
|
168 self._validate = validate |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
169 self._root = root |
49355
0540c1628fd4
sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49351
diff
changeset
|
170 # Either build a sparse-matcher or None if sparse is disabled |
33373
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
171 self._sparsematchfn = sparsematchfn |
24198
3cc630be5f09
dirstate: make sure rootdir ends with directory separator (issue4557)
Yuya Nishihara <yuya@tcha.org>
parents:
23866
diff
changeset
|
172 # ntpath.join(root, '') of Python 2.7.9 does not add sep if root is |
3cc630be5f09
dirstate: make sure rootdir ends with directory separator (issue4557)
Yuya Nishihara <yuya@tcha.org>
parents:
23866
diff
changeset
|
173 # UNC path pointing to root share (issue4557) |
24833
cb981009d697
dirstate: use pathutil.normasprefix to ensure os.sep at the end of root
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24635
diff
changeset
|
174 self._rootdir = pathutil.normasprefix(root) |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
175 # True is any internal state may be different |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
176 self._dirty = False |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
177 # True if the set of tracked file may be different |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
178 self._dirty_tracked_set = False |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
179 self._ui = ui |
16200
9d4a2942a732
dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents:
16143
diff
changeset
|
180 self._filecache = {} |
49961
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
181 # nesting level of `changing_parents` context |
50021
4e955a7a6a55
dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50011
diff
changeset
|
182 self._changing_level = 0 |
50024
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
183 # the change currently underway |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
184 self._change_type = None |
50145
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
185 # number of open _running_status context |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
186 self._running_status = 0 |
49958
96e526fe5fb0
dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49827
diff
changeset
|
187 # True if the current dirstate changing operations have been |
96e526fe5fb0
dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49827
diff
changeset
|
188 # invalidated (used to make sure all nested contexts have been exited) |
96e526fe5fb0
dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49827
diff
changeset
|
189 self._invalidated_context = False |
50122
72b4d9284411
dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50121
diff
changeset
|
190 self._attached_to_a_transaction = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
191 self._filename = b'dirstate' |
48793
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
192 self._filename_th = b'dirstate-tracked-hint' |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
193 self._pendingfilename = b'%s.pending' % self._filename |
29772
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
194 self._plchangecallbacks = {} |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
195 self._origpl = None |
47501
8b7e47802deb
dirstate: split dirstatemap in its own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47489
diff
changeset
|
196 self._mapcls = dirstatemap.dirstatemap |
41674
e178b131906a
dirstate: call and cache os.getcwd() in constructor
Martin von Zweigbergk <martinvonz@google.com>
parents:
40424
diff
changeset
|
197 # Access and cache cwd early, so we don't access it for the first time |
e178b131906a
dirstate: call and cache os.getcwd() in constructor
Martin von Zweigbergk <martinvonz@google.com>
parents:
40424
diff
changeset
|
198 # after a working-copy update caused it to not exist (accessing it then |
e178b131906a
dirstate: call and cache os.getcwd() in constructor
Martin von Zweigbergk <martinvonz@google.com>
parents:
40424
diff
changeset
|
199 # raises an exception). |
e178b131906a
dirstate: call and cache os.getcwd() in constructor
Martin von Zweigbergk <martinvonz@google.com>
parents:
40424
diff
changeset
|
200 self._cwd |
22404
12bc7f06fc41
dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents:
21984
diff
changeset
|
201 |
50128
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50123
diff
changeset
|
202 def refresh(self): |
50301
9fc0d244a753
dirstate: fix a potential traceback when in `copy` and `rename`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50267
diff
changeset
|
203 # XXX if this happens, you likely did not enter the `changing_xxx` |
9fc0d244a753
dirstate: fix a potential traceback when in `copy` and `rename`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50267
diff
changeset
|
204 # using `repo.dirstate`, so a later `repo.dirstate` accesss might call |
9fc0d244a753
dirstate: fix a potential traceback when in `copy` and `rename`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50267
diff
changeset
|
205 # `refresh`. |
9fc0d244a753
dirstate: fix a potential traceback when in `copy` and `rename`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50267
diff
changeset
|
206 if self.is_changing_any: |
9fc0d244a753
dirstate: fix a potential traceback when in `copy` and `rename`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50267
diff
changeset
|
207 msg = "refreshing the dirstate in the middle of a change" |
9fc0d244a753
dirstate: fix a potential traceback when in `copy` and `rename`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50267
diff
changeset
|
208 raise error.ProgrammingError(msg) |
50128
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50123
diff
changeset
|
209 if '_branch' in vars(self): |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50123
diff
changeset
|
210 del self._branch |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50123
diff
changeset
|
211 if '_map' in vars(self) and self._map.may_need_refresh(): |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50123
diff
changeset
|
212 self.invalidate() |
2f60cd6442fd
dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50123
diff
changeset
|
213 |
44826
35b255e474d9
dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44825
diff
changeset
|
214 def prefetch_parents(self): |
35b255e474d9
dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44825
diff
changeset
|
215 """make sure the parents are loaded |
35b255e474d9
dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44825
diff
changeset
|
216 |
35b255e474d9
dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44825
diff
changeset
|
217 Used to avoid a race condition. |
35b255e474d9
dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44825
diff
changeset
|
218 """ |
35b255e474d9
dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44825
diff
changeset
|
219 self._pl |
35b255e474d9
dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44825
diff
changeset
|
220 |
32346
73e67c4386ec
dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents:
32208
diff
changeset
|
221 @contextlib.contextmanager |
50119
de42ba9dd852
dirstate: use the new `check_invalidated` decorator for `_changing`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50118
diff
changeset
|
222 @check_invalidated |
50132
3dd7e54ff7f1
dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50129
diff
changeset
|
223 def running_status(self, repo): |
3dd7e54ff7f1
dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50129
diff
changeset
|
224 """Wrap a status operation |
3dd7e54ff7f1
dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50129
diff
changeset
|
225 |
50144
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
226 This context is not mutally exclusive with the `changing_*` context. It |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
227 also do not warrant for the `wlock` to be taken. |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
228 |
50147
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
229 If the wlock is taken, this context will behave in a simple way, and |
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
230 ensure the data are scheduled for write when leaving the top level |
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
231 context. |
50144
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
232 |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
233 If the lock is not taken, it will only warrant that the data are either |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
234 committed (written) and rolled back (invalidated) when exiting the top |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
235 level context. The write/invalidate action must be performed by the |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
236 wrapped code. |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
237 |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
238 |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
239 The expected logic is: |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
240 |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
241 A: read the dirstate |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
242 B: run status |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
243 This might make the dirstate dirty by updating cache, |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
244 especially in Rust. |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
245 C: do more "post status fixup if relevant |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
246 D: try to take the w-lock (this will invalidate the changes if they were raced) |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
247 E0: if dirstate changed on disk → discard change (done by dirstate internal) |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
248 E1: elif lock was acquired → write the changes |
c6df5349183b
dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50132
diff
changeset
|
249 E2: else → discard the changes |
50132
3dd7e54ff7f1
dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50129
diff
changeset
|
250 """ |
50147
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
251 has_lock = repo.currentwlock() is not None |
50146
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
252 is_changing = self.is_changing_any |
50147
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
253 tr = repo.currenttransaction() |
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
254 has_tr = tr is not None |
50146
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
255 nested = bool(self._running_status) |
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
256 |
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
257 first_and_alone = not (is_changing or has_tr or nested) |
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
258 |
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
259 # enforce no change happened outside of a proper context. |
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
260 if first_and_alone and self._dirty: |
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
261 has_tr = repo.currenttransaction() is not None |
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
262 if not has_tr and self._changing_level == 0 and self._dirty: |
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
263 msg = "entering a status context, but dirstate is already dirty" |
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
264 raise error.ProgrammingError(msg) |
8ba5028de859
dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50145
diff
changeset
|
265 |
50147
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
266 should_write = has_lock and not (nested or is_changing) |
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
267 |
50145
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
268 self._running_status += 1 |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
269 try: |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
270 yield |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
271 except Exception: |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
272 self.invalidate() |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
273 raise |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
274 finally: |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
275 self._running_status -= 1 |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
276 if self._invalidated_context: |
50147
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
277 should_write = False |
50145
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
278 self.invalidate() |
50132
3dd7e54ff7f1
dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50129
diff
changeset
|
279 |
50147
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
280 if should_write: |
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
281 assert repo.currenttransaction() is tr |
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
282 self.write(tr) |
50148
b583988c6c23
dirstate: have `running_status` warn when exiting with a dirty dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50147
diff
changeset
|
283 elif not has_lock: |
b583988c6c23
dirstate: have `running_status` warn when exiting with a dirty dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50147
diff
changeset
|
284 if self._dirty: |
b583988c6c23
dirstate: have `running_status` warn when exiting with a dirty dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50147
diff
changeset
|
285 msg = b'dirstate dirty while exiting an isolated status context' |
b583988c6c23
dirstate: have `running_status` warn when exiting with a dirty dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50147
diff
changeset
|
286 repo.ui.develwarn(msg) |
b583988c6c23
dirstate: have `running_status` warn when exiting with a dirty dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50147
diff
changeset
|
287 self.invalidate() |
50147
0be70c7b609c
dirstate: have `running_status` write the dirstate when holding the lock
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50146
diff
changeset
|
288 |
50132
3dd7e54ff7f1
dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50129
diff
changeset
|
289 @contextlib.contextmanager |
3dd7e54ff7f1
dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50129
diff
changeset
|
290 @check_invalidated |
50024
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
291 def _changing(self, repo, change_type): |
49966
380ed77e9ad3
dirstate: enforce holding the lock while doing any changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49964
diff
changeset
|
292 if repo.currentwlock() is None: |
50024
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
293 msg = b"trying to change the dirstate without holding the wlock" |
49966
380ed77e9ad3
dirstate: enforce holding the lock while doing any changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49964
diff
changeset
|
294 raise error.ProgrammingError(msg) |
50024
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
295 |
50077
605f0ccffb43
dirstate: detect potential fishy transaction patterns while changing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50076
diff
changeset
|
296 has_tr = repo.currenttransaction() is not None |
50117
3433723d1b9b
dirstate: warn if dirty when starting an edition
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50115
diff
changeset
|
297 if not has_tr and self._changing_level == 0 and self._dirty: |
50155
4c67862a0c49
dirstate: phase-divergent update to 3433723d1b9b
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50154
diff
changeset
|
298 msg = b"entering a changing context, but dirstate is already dirty" |
4c67862a0c49
dirstate: phase-divergent update to 3433723d1b9b
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50154
diff
changeset
|
299 repo.ui.develwarn(msg) |
32346
73e67c4386ec
dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents:
32208
diff
changeset
|
300 |
50120
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
301 assert self._changing_level >= 0 |
50024
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
302 # different type of change are mutually exclusive |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
303 if self._change_type is None: |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
304 assert self._changing_level == 0 |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
305 self._change_type = change_type |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
306 elif self._change_type != change_type: |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
307 msg = ( |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
308 'trying to open "%s" dirstate-changing context while a "%s" is' |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
309 ' already open' |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
310 ) |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
311 msg %= (change_type, self._change_type) |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
312 raise error.ProgrammingError(msg) |
50120
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
313 should_write = False |
50021
4e955a7a6a55
dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50011
diff
changeset
|
314 self._changing_level += 1 |
49958
96e526fe5fb0
dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49827
diff
changeset
|
315 try: |
96e526fe5fb0
dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49827
diff
changeset
|
316 yield |
50105
2323b74f927b
dirstate: invalidate on all exceptions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50099
diff
changeset
|
317 except: # re-raises |
50120
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
318 self.invalidate() # this will set `_invalidated_context` |
49958
96e526fe5fb0
dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49827
diff
changeset
|
319 raise |
96e526fe5fb0
dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49827
diff
changeset
|
320 finally: |
50120
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
321 assert self._changing_level > 0 |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
322 self._changing_level -= 1 |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
323 # If the dirstate is being invalidated, call invalidate again. |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
324 # This will throw away anything added by a upper context and |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
325 # reset the `_invalidated_context` flag when relevant |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
326 if self._changing_level <= 0: |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
327 self._change_type = None |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
328 assert self._changing_level == 0 |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
329 if self._invalidated_context: |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
330 # make sure we invalidate anything an upper context might |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
331 # have changed. |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
332 self.invalidate() |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
333 else: |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
334 should_write = self._changing_level <= 0 |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
335 tr = repo.currenttransaction() |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
336 if has_tr != (tr is not None): |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
337 if has_tr: |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
338 m = "transaction vanished while changing dirstate" |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
339 else: |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
340 m = "transaction appeared while changing dirstate" |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
341 raise error.ProgrammingError(m) |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
342 if should_write: |
a7d11833ff48
dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50119
diff
changeset
|
343 self.write(tr) |
32346
73e67c4386ec
dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents:
32208
diff
changeset
|
344 |
50024
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
345 @contextlib.contextmanager |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
346 def changing_parents(self, repo): |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
347 with self._changing(repo, CHANGE_TYPE_PARENTS) as c: |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
348 yield c |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
349 |
50026
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
350 @contextlib.contextmanager |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
351 def changing_files(self, repo): |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
352 with self._changing(repo, CHANGE_TYPE_FILES) as c: |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
353 yield c |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
354 |
49961
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
355 # here to help migration to the new code |
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
356 def parentchange(self): |
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
357 msg = ( |
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
358 "Mercurial 6.4 and later requires call to " |
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
359 "`dirstate.changing_parents(repo)`" |
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
360 ) |
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
361 raise error.ProgrammingError(msg) |
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
362 |
50023
e1cff85484e2
dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50022
diff
changeset
|
363 @property |
e1cff85484e2
dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50022
diff
changeset
|
364 def is_changing_any(self): |
e1cff85484e2
dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50022
diff
changeset
|
365 """Returns true if the dirstate is in the middle of a set of changes. |
e1cff85484e2
dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50022
diff
changeset
|
366 |
e1cff85484e2
dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50022
diff
changeset
|
367 This returns True for any kind of change. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
368 """ |
50023
e1cff85484e2
dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50022
diff
changeset
|
369 return self._changing_level > 0 |
32346
73e67c4386ec
dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents:
32208
diff
changeset
|
370 |
22404
12bc7f06fc41
dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents:
21984
diff
changeset
|
371 def pendingparentchange(self): |
50024
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
372 return self.is_changing_parent() |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
373 |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
374 def is_changing_parent(self): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
375 """Returns true if the dirstate is in the middle of a set of changes |
22404
12bc7f06fc41
dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents:
21984
diff
changeset
|
376 that modify the dirstate parent. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
377 """ |
50022
e333cc169c45
dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50021
diff
changeset
|
378 self._ui.deprecwarn(b"dirstate.is_changing_parents", b"6.5") |
e333cc169c45
dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50021
diff
changeset
|
379 return self.is_changing_parents |
e333cc169c45
dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50021
diff
changeset
|
380 |
e333cc169c45
dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50021
diff
changeset
|
381 @property |
e333cc169c45
dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50021
diff
changeset
|
382 def is_changing_parents(self): |
e333cc169c45
dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50021
diff
changeset
|
383 """Returns true if the dirstate is in the middle of a set of changes |
e333cc169c45
dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50021
diff
changeset
|
384 that modify the dirstate parent. |
e333cc169c45
dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50021
diff
changeset
|
385 """ |
50024
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
386 if self._changing_level <= 0: |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
387 return False |
0dc2fb4b4b11
dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50023
diff
changeset
|
388 return self._change_type == CHANGE_TYPE_PARENTS |
723 | 389 |
50026
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
390 @property |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
391 def is_changing_files(self): |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
392 """Returns true if the dirstate is in the middle of a set of changes |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
393 that modify the files tracked or their sources. |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
394 """ |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
395 if self._changing_level <= 0: |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
396 return False |
3550e4a88ccd
dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50025
diff
changeset
|
397 return self._change_type == CHANGE_TYPE_FILES |
723 | 398 |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
399 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
400 def _map(self): |
35078
a052022639cc
dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents:
35016
diff
changeset
|
401 """Return the dirstate contents (see documentation for dirstatemap).""" |
50129
3c6546b149ed
dirstate: cleanup the `_map` property cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50128
diff
changeset
|
402 return self._mapcls( |
47280
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
403 self._ui, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
404 self._opener, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
405 self._root, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
406 self._nodeconstants, |
1766130fe9ba
dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
47277
diff
changeset
|
407 self._use_dirstate_v2, |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
408 ) |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
409 |
33373
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
410 @property |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
411 def _sparsematcher(self): |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
412 """The matcher for the sparse checkout. |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
413 |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
414 The working directory may not include every file from a manifest. The |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
415 matcher obtained by this property will match a path if it is to be |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
416 included in the working directory. |
49355
0540c1628fd4
sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49351
diff
changeset
|
417 |
0540c1628fd4
sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49351
diff
changeset
|
418 When sparse if disabled, return None. |
33373
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
419 """ |
49355
0540c1628fd4
sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49351
diff
changeset
|
420 if self._sparsematchfn is None: |
0540c1628fd4
sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49351
diff
changeset
|
421 return None |
33373
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
422 # TODO there is potential to cache this property. For now, the matcher |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
423 # is resolved on every access. (But the called function does use a |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
424 # cache to keep the lookup fast.) |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
425 return self._sparsematchfn() |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33215
diff
changeset
|
426 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
427 @repocache(b'branch') |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
428 def _branch(self): |
50256
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
429 f = None |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
430 data = b'' |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
431 try: |
50256
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
432 f, mode = txnutil.trypending(self._root, self._opener, b'branch') |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
433 data = f.read().strip() |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
434 except FileNotFoundError: |
50256
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
435 pass |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
436 finally: |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
437 if f is not None: |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
438 f.close() |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
439 if not data: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
440 return b"default" |
50256
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
441 return data |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
442 |
34339
ec769bba34d3
dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents:
34338
diff
changeset
|
443 @property |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
444 def _pl(self): |
34338
0c3e3810cdb6
dirstate: move parent reading to the dirstatemap class
Durham Goode <durham@fb.com>
parents:
34337
diff
changeset
|
445 return self._map.parents() |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
446 |
35084
61888bd0b300
dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents:
35083
diff
changeset
|
447 def hasdir(self, d): |
61888bd0b300
dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents:
35083
diff
changeset
|
448 return self._map.hastrackeddir(d) |
16143
fceb2964fa6c
context: add 'dirs()' to changectx/workingctx for directory patterns
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15801
diff
changeset
|
449 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
450 @rootcache(b'.hgignore') |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
451 def _ignore(self): |
27594
0921caca7703
dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents:
27593
diff
changeset
|
452 files = self._ignorefiles() |
25216
dc562165044a
ignore: use 'include:' rules instead of custom syntax
Durham Goode <durham@fb.com>
parents:
25163
diff
changeset
|
453 if not files: |
41676
0531dff73d0b
match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41674
diff
changeset
|
454 return matchmod.never() |
25216
dc562165044a
ignore: use 'include:' rules instead of custom syntax
Durham Goode <durham@fb.com>
parents:
25163
diff
changeset
|
455 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
456 pats = [b'include:%s' % f for f in files] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
457 return matchmod.match(self._root, b'', [], pats, warn=self._ui.warn) |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
458 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
459 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
460 def _slash(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
461 return self._ui.configbool(b'ui', b'slash') and pycompat.ossep != b'/' |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
462 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
463 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
464 def _checklink(self): |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
465 return util.checklink(self._root) |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
466 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
467 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
468 def _checkexec(self): |
44801
373dd22ae60e
dirstate: force _checkexec to return a bool
Mitchell Plamann <mplamann@janestreet.com>
parents:
44530
diff
changeset
|
469 return bool(util.checkexec(self._root)) |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
470 |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
471 @propertycache |
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
472 def _checkcase(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
473 return not util.fscasesensitive(self._join(b'.hg')) |
8261
0fe1f57ac2bd
dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8226
diff
changeset
|
474 |
4905
fc61495ea9cf
dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
475 def _join(self, f): |
6972
63d1d3e489f8
performance: normalize self._root, avoid calling os.path.join() in dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6971
diff
changeset
|
476 # much faster than os.path.join() |
6973
8c136043867b
dirstate: explain why appending instead of os.path.join() is safe
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6972
diff
changeset
|
477 # it's safe because f is always a relative path |
6972
63d1d3e489f8
performance: normalize self._root, avoid calling os.path.join() in dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6971
diff
changeset
|
478 return self._rootdir + f |
723 | 479 |
15337
cf5f9df6406b
windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents:
15057
diff
changeset
|
480 def flagfunc(self, buildfallback): |
48290
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
481 """build a callable that returns flags associated with a filename |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
482 |
48290
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
483 The information is extracted from three possible layers: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
484 1. the file system if it supports the information |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
485 2. the "fallback" information stored in the dirstate if any |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
486 3. a more expensive mechanism inferring the flags from the parents. |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
487 """ |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
488 |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
489 # small hack to cache the result of buildfallback() |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
490 fallback_func = [] |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
491 |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
492 def get_flags(x): |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
493 entry = None |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
494 fallback_value = None |
48282
0d6a099bba58
dirstate: group return logic and clarify each function in flagfunc
Raphaël Gomès <rgomes@octobus.net>
parents:
48281
diff
changeset
|
495 try: |
0d6a099bba58
dirstate: group return logic and clarify each function in flagfunc
Raphaël Gomès <rgomes@octobus.net>
parents:
48281
diff
changeset
|
496 st = os.lstat(self._join(x)) |
48290
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
497 except OSError: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
498 return b'' |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
499 |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
500 if self._checklink: |
48282
0d6a099bba58
dirstate: group return logic and clarify each function in flagfunc
Raphaël Gomès <rgomes@octobus.net>
parents:
48281
diff
changeset
|
501 if util.statislink(st): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
502 return b'l' |
48290
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
503 else: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
504 entry = self.get_entry(x) |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
505 if entry.has_fallback_symlink: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
506 if entry.fallback_symlink: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
507 return b'l' |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
508 else: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
509 if not fallback_func: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
510 fallback_func.append(buildfallback()) |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
511 fallback_value = fallback_func[0](x) |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
512 if b'l' in fallback_value: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
513 return b'l' |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
514 |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
515 if self._checkexec: |
48282
0d6a099bba58
dirstate: group return logic and clarify each function in flagfunc
Raphaël Gomès <rgomes@octobus.net>
parents:
48281
diff
changeset
|
516 if util.statisexec(st): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
517 return b'x' |
48290
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
518 else: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
519 if entry is None: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
520 entry = self.get_entry(x) |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
521 if entry.has_fallback_exec: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
522 if entry.fallback_exec: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
523 return b'x' |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
524 else: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
525 if fallback_value is None: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
526 if not fallback_func: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
527 fallback_func.append(buildfallback()) |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
528 fallback_value = fallback_func[0](x) |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
529 if b'x' in fallback_value: |
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
530 return b'x' |
48282
0d6a099bba58
dirstate: group return logic and clarify each function in flagfunc
Raphaël Gomès <rgomes@octobus.net>
parents:
48281
diff
changeset
|
531 return b'' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
532 |
48290
91f07430db8c
dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48282
diff
changeset
|
533 return get_flags |
48281
8f54d9c79b12
dirstate: add missing return on platforms without exec or symlink
Raphaël Gomès <rgomes@octobus.net>
parents:
48260
diff
changeset
|
534 |
20335
e40520642e64
rebase: do not crash in panic when cwd disapear in the process (issue4121)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20033
diff
changeset
|
535 @propertycache |
e40520642e64
rebase: do not crash in panic when cwd disapear in the process (issue4121)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20033
diff
changeset
|
536 def _cwd(self): |
33215
b7f6885cb055
dirstate: centralize _cwd handling into _cwd method
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32772
diff
changeset
|
537 # internal config: ui.forcecwd |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
538 forcecwd = self._ui.config(b'ui', b'forcecwd') |
33215
b7f6885cb055
dirstate: centralize _cwd handling into _cwd method
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32772
diff
changeset
|
539 if forcecwd: |
b7f6885cb055
dirstate: centralize _cwd handling into _cwd method
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32772
diff
changeset
|
540 return forcecwd |
39818
24e493ec2229
py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents:
39452
diff
changeset
|
541 return encoding.getcwd() |
20335
e40520642e64
rebase: do not crash in panic when cwd disapear in the process (issue4121)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20033
diff
changeset
|
542 |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
543 def getcwd(self): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
544 """Return the path from which a canonical path is calculated. |
26293
3d24f31c6b8f
dirstate: state that getcwd() shouldn't be used to get real file path
Yuya Nishihara <yuya@tcha.org>
parents:
25877
diff
changeset
|
545 |
3d24f31c6b8f
dirstate: state that getcwd() shouldn't be used to get real file path
Yuya Nishihara <yuya@tcha.org>
parents:
25877
diff
changeset
|
546 This path should be used to resolve file patterns or to convert |
3d24f31c6b8f
dirstate: state that getcwd() shouldn't be used to get real file path
Yuya Nishihara <yuya@tcha.org>
parents:
25877
diff
changeset
|
547 canonical paths back to file paths for display. It shouldn't be |
3d24f31c6b8f
dirstate: state that getcwd() shouldn't be used to get real file path
Yuya Nishihara <yuya@tcha.org>
parents:
25877
diff
changeset
|
548 used to get real file paths. Use vfs functions instead. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
549 """ |
20335
e40520642e64
rebase: do not crash in panic when cwd disapear in the process (issue4121)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20033
diff
changeset
|
550 cwd = self._cwd |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
551 if cwd == self._root: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
552 return b'' |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
553 # self._root ends with a path separator if self._root is '/' or 'C:\' |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
554 rootsep = self._root |
5843
83c354c4d529
Add endswithsep() and use it instead of using os.sep and os.altsep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5842
diff
changeset
|
555 if not util.endswithsep(rootsep): |
30614
cfe66dcf45c0
py3: replace os.sep with pycompat.ossep (part 2 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30519
diff
changeset
|
556 rootsep += pycompat.ossep |
4230
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
557 if cwd.startswith(rootsep): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
558 return cwd[len(rootsep) :] |
4230
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
559 else: |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
560 # we're outside the repo. return an absolute path. |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
561 return cwd |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
562 |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
563 def pathto(self, f, cwd=None): |
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
564 if cwd is None: |
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
565 cwd = self.getcwd() |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
566 path = util.pathto(self._root, cwd, f) |
4527
b422b558015b
Add ui.slash hgrc setting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
567 if self._slash: |
19210
865beb849720
dirstate: don't overnormalize for ui.slash
Matt Mackall <mpm@selenic.com>
parents:
19128
diff
changeset
|
568 return util.pconvert(path) |
4527
b422b558015b
Add ui.slash hgrc setting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
569 return path |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4507
diff
changeset
|
570 |
48085
6a78715e56c8
dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48059
diff
changeset
|
571 def get_entry(self, path): |
6a78715e56c8
dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48059
diff
changeset
|
572 """return a DirstateItem for the associated path""" |
6a78715e56c8
dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48059
diff
changeset
|
573 entry = self._map.get(path) |
6a78715e56c8
dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48059
diff
changeset
|
574 if entry is None: |
6a78715e56c8
dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48059
diff
changeset
|
575 return DirstateItem() |
6a78715e56c8
dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48059
diff
changeset
|
576 return entry |
6a78715e56c8
dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48059
diff
changeset
|
577 |
220 | 578 def __contains__(self, key): |
4614
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
579 return key in self._map |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
580 |
a8be3c875988
dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents:
4613
diff
changeset
|
581 def __iter__(self): |
33707
36d216dcae6a
dirstate: simplify dirstate's __iter__
Alex Gaynor <agaynor@mozilla.com>
parents:
33440
diff
changeset
|
582 return iter(sorted(self._map)) |
220 | 583 |
32550
b98199a5c3e1
cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents:
32372
diff
changeset
|
584 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
|
585 return self._map.items() |
18792
10669e24eb6c
completion: add a debugpathcomplete command
Bryan O'Sullivan <bryano@fb.com>
parents:
18760
diff
changeset
|
586 |
32550
b98199a5c3e1
cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents:
32372
diff
changeset
|
587 iteritems = items |
b98199a5c3e1
cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents:
32372
diff
changeset
|
588 |
227 | 589 def parents(self): |
13032
e41e2b79883d
dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents:
12907
diff
changeset
|
590 return [self._validate(p) for p in self._pl] |
227 | 591 |
13876
10c7d92ac482
dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents:
13763
diff
changeset
|
592 def p1(self): |
10c7d92ac482
dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents:
13763
diff
changeset
|
593 return self._validate(self._pl[0]) |
10c7d92ac482
dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents:
13763
diff
changeset
|
594 |
10c7d92ac482
dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents:
13763
diff
changeset
|
595 def p2(self): |
10c7d92ac482
dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents:
13763
diff
changeset
|
596 return self._validate(self._pl[1]) |
10c7d92ac482
dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents:
13763
diff
changeset
|
597 |
47510
94c58f3aab56
dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47501
diff
changeset
|
598 @property |
94c58f3aab56
dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47501
diff
changeset
|
599 def in_merge(self): |
94c58f3aab56
dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47501
diff
changeset
|
600 """True if a merge is in progress""" |
94c58f3aab56
dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47501
diff
changeset
|
601 return self._pl[1] != self._nodeconstants.nullid |
94c58f3aab56
dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47501
diff
changeset
|
602 |
4179
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
603 def branch(self): |
13047
6c375e07d673
branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents:
13032
diff
changeset
|
604 return encoding.tolocal(self._branch) |
4179
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
605 |
50106
cdbd5f990596
dirstate: requires being in a `changing_parents` `context to set_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50105
diff
changeset
|
606 @requires_changing_parents |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
607 def setparents(self, p1, p2=None): |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16542
diff
changeset
|
608 """Set dirstate parents to p1 and p2. |
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16542
diff
changeset
|
609 |
47513
10e740292dff
dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47512
diff
changeset
|
610 When moving from two parents to one, "merged" entries a |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16542
diff
changeset
|
611 adjusted to normal and previous copy records discarded and |
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16542
diff
changeset
|
612 returned by the call. |
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16542
diff
changeset
|
613 |
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16542
diff
changeset
|
614 See localrepo.setparents() |
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16542
diff
changeset
|
615 """ |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
616 if p2 is None: |
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
617 p2 = self._nodeconstants.nullid |
50021
4e955a7a6a55
dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50011
diff
changeset
|
618 if self._changing_level == 0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
619 raise ValueError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
620 b"cannot set dirstate parent outside of " |
49961
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
621 b"dirstate.changing_parents context manager" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
622 ) |
22407
d259322a394b
dirstate: add exception when calling setparent without begin/end (API)
Durham Goode <durham@fb.com>
parents:
22404
diff
changeset
|
623 |
34339
ec769bba34d3
dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents:
34338
diff
changeset
|
624 self._dirty = True |
16509
eab9119c5dee
rebase: skip resolved but emptied revisions
Patrick Mezard <patrick@mezard.eu>
parents:
16472
diff
changeset
|
625 oldp2 = self._pl[1] |
29772
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
626 if self._origpl is None: |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
627 self._origpl = self._pl |
47987
dd267f16042f
dirstate: make a conditionnal easier to read in `setparents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47986
diff
changeset
|
628 nullid = self._nodeconstants.nullid |
48059
5d68c4eedd66
dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48058
diff
changeset
|
629 # True if we need to fold p2 related state back to a linear case |
5d68c4eedd66
dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48058
diff
changeset
|
630 fold_p2 = oldp2 != nullid and p2 == nullid |
5d68c4eedd66
dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48058
diff
changeset
|
631 return self._map.setparents(p1, p2, fold_p2=fold_p2) |
227 | 632 |
50266
307c155e6275
dirstate: deprecate calling `setbranch` without a transaction parameter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50256
diff
changeset
|
633 def setbranch(self, branch, transaction=SENTINEL): |
40424
7caf632e30c3
filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
39818
diff
changeset
|
634 self.__class__._branch.set(self, encoding.fromlocal(branch)) |
50266
307c155e6275
dirstate: deprecate calling `setbranch` without a transaction parameter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50256
diff
changeset
|
635 if transaction is SENTINEL: |
307c155e6275
dirstate: deprecate calling `setbranch` without a transaction parameter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50256
diff
changeset
|
636 msg = b"setbranch needs a `transaction` argument" |
307c155e6275
dirstate: deprecate calling `setbranch` without a transaction parameter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50256
diff
changeset
|
637 self._ui.deprecwarn(msg, b'6.5') |
307c155e6275
dirstate: deprecate calling `setbranch` without a transaction parameter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50256
diff
changeset
|
638 transaction = None |
50256
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
639 if transaction is not None: |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
640 self._setup_tr_abort(transaction) |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
641 transaction.addfilegenerator( |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
642 b'dirstate-3-branch%s' % self._tr_key_suffix, |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
643 (b'branch',), |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
644 self._write_branch, |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
645 location=b'plain', |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
646 post_finalize=True, |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
647 ) |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
648 return |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
649 |
50254
df76808d5f21
dirstate: use a context manager to handle the file used for writing the branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50208
diff
changeset
|
650 vfs = self._opener |
df76808d5f21
dirstate: use a context manager to handle the file used for writing the branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50208
diff
changeset
|
651 with vfs(b'branch', b'w', atomictemp=True, checkambig=True) as f: |
50256
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
652 self._write_branch(f) |
18317
365fecd984c7
dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents:
18078
diff
changeset
|
653 # make sure filecache has the correct stat info for _branch after |
365fecd984c7
dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents:
18078
diff
changeset
|
654 # replacing the underlying file |
50254
df76808d5f21
dirstate: use a context manager to handle the file used for writing the branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50208
diff
changeset
|
655 # |
df76808d5f21
dirstate: use a context manager to handle the file used for writing the branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50208
diff
changeset
|
656 # XXX do we actually need this, |
df76808d5f21
dirstate: use a context manager to handle the file used for writing the branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50208
diff
changeset
|
657 # refreshing the attribute is quite cheap |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
658 ce = self._filecache[b'_branch'] |
18317
365fecd984c7
dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents:
18078
diff
changeset
|
659 if ce: |
365fecd984c7
dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents:
18078
diff
changeset
|
660 ce.refresh() |
4179
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4172
diff
changeset
|
661 |
50256
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
662 def _write_branch(self, file_obj): |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
663 file_obj.write(self._branch + b'\n') |
a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50255
diff
changeset
|
664 |
4613
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4612
diff
changeset
|
665 def invalidate(self): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
666 """Causes the next access to reread the dirstate. |
32682
e696f597d02f
dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents:
32605
diff
changeset
|
667 |
e696f597d02f
dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents:
32605
diff
changeset
|
668 This is different from localrepo.invalidatedirstate() because it always |
e696f597d02f
dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents:
32605
diff
changeset
|
669 rereads the dirstate. Use localrepo.invalidatedirstate() if you want to |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
670 check whether the dirstate has changed before rereading it.""" |
32682
e696f597d02f
dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents:
32605
diff
changeset
|
671 |
43503
313e3a279828
cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents:
43456
diff
changeset
|
672 for a in ("_map", "_branch", "_ignore"): |
4953
6b3ed43f77ba
dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4952
diff
changeset
|
673 if a in self.__dict__: |
6b3ed43f77ba
dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4952
diff
changeset
|
674 delattr(self, a) |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
675 self._dirty = False |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
676 self._dirty_tracked_set = False |
50145
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
677 self._invalidated_context = bool( |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
678 self._changing_level > 0 |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
679 or self._attached_to_a_transaction |
72ef6c4888da
dirstate: start tracking that we are within a `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50144
diff
changeset
|
680 or self._running_status |
50122
72b4d9284411
dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50121
diff
changeset
|
681 ) |
29772
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
682 self._origpl = None |
4375
109077e7048d
When reloading the dirstate, recompute ignore information if needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4374
diff
changeset
|
683 |
50109
bec7182cc406
dirstate: mark the `copy` method as requiring a `changing_any` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50108
diff
changeset
|
684 @requires_changing_any |
363 | 685 def copy(self, source, dest): |
10145
aec936051734
dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents:
9678
diff
changeset
|
686 """Mark dest as a copy of source. Unmark dest if source is None.""" |
6680
deda205a00e1
Ignore dummy copies in dirstate and localrepo.filecommit()
Patrick Mezard <pmezard@gmail.com>
parents:
6479
diff
changeset
|
687 if source == dest: |
deda205a00e1
Ignore dummy copies in dirstate and localrepo.filecommit()
Patrick Mezard <pmezard@gmail.com>
parents:
6479
diff
changeset
|
688 return |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
689 self._dirty = True |
7566
5f7e3f17aece
mq: drop copy records when refreshing regular patches (issue1441)
Patrick Mezard <pmezard@gmail.com>
parents:
7280
diff
changeset
|
690 if source is not None: |
49360
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
691 self._check_sparse(source) |
34336
0865d25e8a8a
dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents:
34335
diff
changeset
|
692 self._map.copymap[dest] = source |
48057
62188e4de549
dirstate: drop the `_updatedfiles` set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48055
diff
changeset
|
693 else: |
62188e4de549
dirstate: drop the `_updatedfiles` set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48055
diff
changeset
|
694 self._map.copymap.pop(dest, None) |
363 | 695 |
696 def copied(self, file): | |
34336
0865d25e8a8a
dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents:
34335
diff
changeset
|
697 return self._map.copymap.get(file, None) |
3154
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
698 |
b1f10d3223c1
dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents:
2962
diff
changeset
|
699 def copies(self): |
34336
0865d25e8a8a
dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents:
34335
diff
changeset
|
700 return self._map.copymap |
515 | 701 |
50060
4f758b51bf9b
dirstate: enforce the use of `changing_files` context to change tracking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50026
diff
changeset
|
702 @requires_changing_files |
48384
9f1b9e128788
dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48379
diff
changeset
|
703 def set_tracked(self, filename, reset_copy=False): |
47593
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
704 """a "public" method for generic code to mark a file as tracked |
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
705 |
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
706 This function is to be called outside of "update/merge" case. For |
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
707 example by a command like `hg add X`. |
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
708 |
48384
9f1b9e128788
dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48379
diff
changeset
|
709 if reset_copy is set, any existing copy information will be dropped. |
9f1b9e128788
dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48379
diff
changeset
|
710 |
47593
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
711 return True the file was previously untracked, False otherwise. |
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
712 """ |
47984
6255a0d33c45
dirstate: directly call the right function in `set_tracked`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47983
diff
changeset
|
713 self._dirty = True |
47593
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
714 entry = self._map.get(filename) |
47990
0d2a404f1932
dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47989
diff
changeset
|
715 if entry is None or not entry.tracked: |
47984
6255a0d33c45
dirstate: directly call the right function in `set_tracked`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47983
diff
changeset
|
716 self._check_new_tracked_filename(filename) |
48384
9f1b9e128788
dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48379
diff
changeset
|
717 pre_tracked = self._map.set_tracked(filename) |
9f1b9e128788
dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48379
diff
changeset
|
718 if reset_copy: |
9f1b9e128788
dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48379
diff
changeset
|
719 self._map.copymap.pop(filename, None) |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
720 if pre_tracked: |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
721 self._dirty_tracked_set = True |
48384
9f1b9e128788
dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48379
diff
changeset
|
722 return pre_tracked |
47593
f927ad5a4e2c
dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47592
diff
changeset
|
723 |
50060
4f758b51bf9b
dirstate: enforce the use of `changing_files` context to change tracking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50026
diff
changeset
|
724 @requires_changing_files |
47599
cce51119bfe6
dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47594
diff
changeset
|
725 def set_untracked(self, filename): |
cce51119bfe6
dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47594
diff
changeset
|
726 """a "public" method for generic code to mark a file as untracked |
cce51119bfe6
dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47594
diff
changeset
|
727 |
cce51119bfe6
dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47594
diff
changeset
|
728 This function is to be called outside of "update/merge" case. For |
cce51119bfe6
dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47594
diff
changeset
|
729 example by a command like `hg remove X`. |
cce51119bfe6
dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47594
diff
changeset
|
730 |
cce51119bfe6
dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47594
diff
changeset
|
731 return True the file was previously tracked, False otherwise. |
cce51119bfe6
dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47594
diff
changeset
|
732 """ |
47972
5a6c1ef4bcac
dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47971
diff
changeset
|
733 ret = self._map.set_untracked(filename) |
5a6c1ef4bcac
dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47971
diff
changeset
|
734 if ret: |
47861
1c797757f5bb
dirstate: directly call the dirstatemap in `set_untracked`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47778
diff
changeset
|
735 self._dirty = True |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
736 self._dirty_tracked_set = True |
47972
5a6c1ef4bcac
dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47971
diff
changeset
|
737 return ret |
47599
cce51119bfe6
dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47594
diff
changeset
|
738 |
50152
e9379b55ed80
dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50149
diff
changeset
|
739 @requires_changing_files_or_status |
48385
080151f18f3a
dirstate: make it mandatory to provide parentfiledata in `set_clean`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48384
diff
changeset
|
740 def set_clean(self, filename, parentfiledata): |
47704
8a50fb0784a9
dirstate: introduce a `set_clean` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47701
diff
changeset
|
741 """record that the current state of the file on disk is known to be clean""" |
8a50fb0784a9
dirstate: introduce a `set_clean` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47701
diff
changeset
|
742 self._dirty = True |
47974
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47973
diff
changeset
|
743 if not self._map[filename].tracked: |
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47973
diff
changeset
|
744 self._check_new_tracked_filename(filename) |
48385
080151f18f3a
dirstate: make it mandatory to provide parentfiledata in `set_clean`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48384
diff
changeset
|
745 (mode, size, mtime) = parentfiledata |
47974
4e6f27230aee
dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47973
diff
changeset
|
746 self._map.set_clean(filename, mode, size, mtime) |
47704
8a50fb0784a9
dirstate: introduce a `set_clean` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47701
diff
changeset
|
747 |
50152
e9379b55ed80
dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50149
diff
changeset
|
748 @requires_changing_files_or_status |
47720
b0314d8deee1
dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47719
diff
changeset
|
749 def set_possibly_dirty(self, filename): |
b0314d8deee1
dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47719
diff
changeset
|
750 """record that the current state of the file on disk is unknown""" |
b0314d8deee1
dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47719
diff
changeset
|
751 self._dirty = True |
b0314d8deee1
dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47719
diff
changeset
|
752 self._map.set_possibly_dirty(filename) |
b0314d8deee1
dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47719
diff
changeset
|
753 |
49963
23b70ce09e55
dirstate: rename `@requires_parents_change` to `@requires_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49962
diff
changeset
|
754 @requires_changing_parents |
47693
46c318b9b9a4
dirstate: rename `update_file_reference` to `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47692
diff
changeset
|
755 def update_file_p1( |
47592
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
756 self, |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
757 filename, |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
758 p1_tracked, |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
759 ): |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
760 """Set a file as tracked in the parent (or not) |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
761 |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
762 This is to be called when adjust the dirstate to a new parent after an history |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
763 rewriting operation. |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
764 |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
765 It should not be called during a merge (p2 != nullid) and only within |
49961
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
766 a `with dirstate.changing_parents(repo):` context. |
47592
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
767 """ |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
768 if self.in_merge: |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
769 msg = b'update_file_reference should not be called when merging' |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
770 raise error.ProgrammingError(msg) |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
771 entry = self._map.get(filename) |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
772 if entry is None: |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
773 wc_tracked = False |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
774 else: |
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
775 wc_tracked = entry.tracked |
48140
98b3eb6c1479
dirstate: align the dirstatemap's API to the data change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
776 if not (p1_tracked or wc_tracked): |
47592
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
777 # the file is no longer relevant to anyone |
47999
bac82c2ce858
dirstate: use `reset_state` to drop file in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47995
diff
changeset
|
778 if self._map.get(filename) is not None: |
bac82c2ce858
dirstate: use `reset_state` to drop file in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47995
diff
changeset
|
779 self._map.reset_state(filename) |
47988
d459c6b84961
dirstate: inline the last two `_drop` usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47987
diff
changeset
|
780 self._dirty = True |
47592
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
781 elif (not p1_tracked) and wc_tracked: |
47694
1c06ef8f5ea5
dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47693
diff
changeset
|
782 if entry is not None and entry.added: |
1c06ef8f5ea5
dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47693
diff
changeset
|
783 return # avoid dropping copy information (maybe?) |
47592
0f5c203eb5ab
dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47591
diff
changeset
|
784 |
47694
1c06ef8f5ea5
dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47693
diff
changeset
|
785 self._map.reset_state( |
1c06ef8f5ea5
dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47693
diff
changeset
|
786 filename, |
1c06ef8f5ea5
dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47693
diff
changeset
|
787 wc_tracked, |
1c06ef8f5ea5
dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47693
diff
changeset
|
788 p1_tracked, |
48140
98b3eb6c1479
dirstate: align the dirstatemap's API to the data change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
789 # the underlying reference might have changed, we will have to |
98b3eb6c1479
dirstate: align the dirstatemap's API to the data change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
790 # check it. |
98b3eb6c1479
dirstate: align the dirstatemap's API to the data change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
791 has_meaningful_mtime=False, |
47694
1c06ef8f5ea5
dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47693
diff
changeset
|
792 ) |
1c06ef8f5ea5
dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47693
diff
changeset
|
793 |
49963
23b70ce09e55
dirstate: rename `@requires_parents_change` to `@requires_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49962
diff
changeset
|
794 @requires_changing_parents |
47611
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
795 def update_file( |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
796 self, |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
797 filename, |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
798 wc_tracked, |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
799 p1_tracked, |
48144
6f54afb094bd
dirstate: align the dirstate's API to the lower level ones
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48141
diff
changeset
|
800 p2_info=False, |
47611
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
801 possibly_dirty=False, |
47691
33beeb32f73a
dirstate: replace `update_parent_file_data` with simpler `update_parent` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47690
diff
changeset
|
802 parentfiledata=None, |
47611
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
803 ): |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
804 """update the information about a file in the dirstate |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
805 |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
806 This is to be called when the direstates parent changes to keep track |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
807 of what is the file situation in regards to the working copy and its parent. |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
808 |
49961
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
809 This function must be called within a `dirstate.changing_parents` context. |
47611
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
810 |
47771
03089463c554
dirstate: fix typo in docstring
Augie Fackler <augie@google.com>
parents:
47757
diff
changeset
|
811 note: the API is at an early stage and we might need to adjust it |
47611
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
812 depending of what information ends up being relevant and useful to |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
813 other processing. |
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
814 """ |
50011
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
815 self._update_file( |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
816 filename=filename, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
817 wc_tracked=wc_tracked, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
818 p1_tracked=p1_tracked, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
819 p2_info=p2_info, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
820 possibly_dirty=possibly_dirty, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
821 parentfiledata=parentfiledata, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
822 ) |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
823 |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
824 def hacky_extension_update_file(self, *args, **kwargs): |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
825 """NEVER USE THIS, YOU DO NOT NEED IT |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
826 |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
827 This function is a variant of "update_file" to be called by a small set |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
828 of extensions, it also adjust the internal state of file, but can be |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
829 called outside an `changing_parents` context. |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
830 |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
831 A very small number of extension meddle with the working copy content |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
832 in a way that requires to adjust the dirstate accordingly. At the time |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
833 this command is written they are : |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
834 - keyword, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
835 - largefile, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
836 PLEASE DO NOT GROW THIS LIST ANY FURTHER. |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
837 |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
838 This function could probably be replaced by more semantic one (like |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
839 "adjust expected size" or "always revalidate file content", etc) |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
840 however at the time where this is writen, this is too much of a detour |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
841 to be considered. |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
842 """ |
50154
028fb89a0539
dirstate: enforce change context for hacky_extension_update_file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50152
diff
changeset
|
843 if not (self._changing_level > 0 or self._running_status > 0): |
028fb89a0539
dirstate: enforce change context for hacky_extension_update_file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50152
diff
changeset
|
844 msg = "requires a changes context" |
028fb89a0539
dirstate: enforce change context for hacky_extension_update_file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50152
diff
changeset
|
845 raise error.ProgrammingError(msg) |
50011
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
846 self._update_file( |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
847 *args, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
848 **kwargs, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
849 ) |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
850 |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
851 def _update_file( |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
852 self, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
853 filename, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
854 wc_tracked, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
855 p1_tracked, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
856 p2_info=False, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
857 possibly_dirty=False, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
858 parentfiledata=None, |
016dc2387943
dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50003
diff
changeset
|
859 ): |
47692
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
860 |
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
861 # note: I do not think we need to double check name clash here since we |
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
862 # are in a update/merge case that should already have taken care of |
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
863 # this. The test agrees |
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
864 |
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
865 self._dirty = True |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
866 old_entry = self._map.get(filename) |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
867 if old_entry is None: |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
868 prev_tracked = False |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
869 else: |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
870 prev_tracked = old_entry.tracked |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
871 if prev_tracked != wc_tracked: |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
872 self._dirty_tracked_set = True |
47692
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
873 |
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
874 self._map.reset_state( |
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
875 filename, |
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
876 wc_tracked, |
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
877 p1_tracked, |
48144
6f54afb094bd
dirstate: align the dirstate's API to the lower level ones
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48141
diff
changeset
|
878 p2_info=p2_info, |
48140
98b3eb6c1479
dirstate: align the dirstatemap's API to the data change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48121
diff
changeset
|
879 has_meaningful_mtime=not possibly_dirty, |
47692
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
880 parentfiledata=parentfiledata, |
e5fb14a07866
dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47691
diff
changeset
|
881 ) |
47611
e2e72daac90b
dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47599
diff
changeset
|
882 |
47973
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
883 def _check_new_tracked_filename(self, filename): |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
884 scmutil.checkfilename(filename) |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
885 if self._map.hastrackeddir(filename): |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
886 msg = _(b'directory %r already in dirstate') |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
887 msg %= pycompat.bytestr(filename) |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
888 raise error.Abort(msg) |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
889 # shadows |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
890 for d in pathutil.finddirs(filename): |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
891 if self._map.hastrackeddir(d): |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
892 break |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
893 entry = self._map.get(d) |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
894 if entry is not None and not entry.removed: |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
895 msg = _(b'file %r in dirstate clashes with %r') |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
896 msg %= (pycompat.bytestr(d), pycompat.bytestr(filename)) |
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
897 raise error.Abort(msg) |
49360
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
898 self._check_sparse(filename) |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
899 |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
900 def _check_sparse(self, filename): |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
901 """Check that a filename is inside the sparse profile""" |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
902 sparsematch = self._sparsematcher |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
903 if sparsematch is not None and not sparsematch.always(): |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
904 if not sparsematch(filename): |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
905 msg = _(b"cannot add '%s' - it is outside the sparse checkout") |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
906 hint = _( |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
907 b'include file with `hg debugsparse --include <pattern>` or use ' |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
908 b'`hg add -s <file>` to include file directory while adding' |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
909 ) |
bd3519dc6741
sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49357
diff
changeset
|
910 raise error.Abort(msg % filename, hint=hint) |
47973
2e0ff3947b05
dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47972
diff
changeset
|
911 |
24538
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
912 def _discoverpath(self, path, normed, ignoremissing, exists, storemap): |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
913 if exists is None: |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
914 exists = os.path.lexists(os.path.join(self._root, path)) |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
915 if not exists: |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
916 # Maybe a path component exists |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
917 if not ignoremissing and b'/' in path: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
918 d, f = path.rsplit(b'/', 1) |
24538
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
919 d = self._normalize(d, False, ignoremissing, None) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
920 folded = d + b"/" + f |
24538
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
921 else: |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
922 # No path components, preserve original case |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
923 folded = path |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
924 else: |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
925 # recursively normalize leading directory components |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
926 # against dirstate |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
927 if b'/' in normed: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
928 d, f = normed.rsplit(b'/', 1) |
24538
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
929 d = self._normalize(d, False, ignoremissing, True) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
930 r = self._root + b"/" + d |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
931 folded = d + b"/" + util.fspath(f, r) |
24538
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
932 else: |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
933 folded = util.fspath(normed, self._root) |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
934 storemap[normed] = folded |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
935 |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
936 return folded |
24df92075200
dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents:
24523
diff
changeset
|
937 |
24539
3a8eba78803e
dirstate: introduce function to normalize just filenames
Siddharth Agarwal <sid0@fb.com>
parents:
24538
diff
changeset
|
938 def _normalizefile(self, path, isknown, ignoremissing=False, exists=None): |
15488
6eff984d8e76
dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents:
15399
diff
changeset
|
939 normed = util.normcase(path) |
34676
bfddc3d678ae
dirstate: remove _filefoldmap property cache
Durham Goode <durham@fb.com>
parents:
34675
diff
changeset
|
940 folded = self._map.filefoldmap.get(normed, None) |
13717
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
941 if folded is None: |
16542
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16509
diff
changeset
|
942 if isknown: |
13717
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
943 folded = path |
7068
57377fa7eda2
issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents:
7034
diff
changeset
|
944 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
945 folded = self._discoverpath( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
946 path, normed, ignoremissing, exists, self._map.filefoldmap |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
947 ) |
24539
3a8eba78803e
dirstate: introduce function to normalize just filenames
Siddharth Agarwal <sid0@fb.com>
parents:
24538
diff
changeset
|
948 return folded |
16302
49b54f1ae053
dirstate: normalize case of directory components
Matt Mackall <mpm@selenic.com>
parents:
16258
diff
changeset
|
949 |
16542
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16509
diff
changeset
|
950 def _normalize(self, path, isknown, ignoremissing=False, exists=None): |
15488
6eff984d8e76
dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents:
15399
diff
changeset
|
951 normed = util.normcase(path) |
34676
bfddc3d678ae
dirstate: remove _filefoldmap property cache
Durham Goode <durham@fb.com>
parents:
34675
diff
changeset
|
952 folded = self._map.filefoldmap.get(normed, None) |
24561
6514030dc686
dirstate._normalize: don't construct dirfoldmap if not necessary
Siddharth Agarwal <sid0@fb.com>
parents:
24560
diff
changeset
|
953 if folded is None: |
34678
e8a89ed7ce96
dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents:
34677
diff
changeset
|
954 folded = self._map.dirfoldmap.get(normed, None) |
13717
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
955 if folded is None: |
16542
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16509
diff
changeset
|
956 if isknown: |
13717
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
957 folded = path |
7068
57377fa7eda2
issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents:
7034
diff
changeset
|
958 else: |
24540
25c1d3ca5ff6
dirstate: split the foldmap into separate ones for files and directories
Siddharth Agarwal <sid0@fb.com>
parents:
24539
diff
changeset
|
959 # store discovered result in dirfoldmap so that future |
25c1d3ca5ff6
dirstate: split the foldmap into separate ones for files and directories
Siddharth Agarwal <sid0@fb.com>
parents:
24539
diff
changeset
|
960 # normalizefile calls don't start matching directories |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
961 folded = self._discoverpath( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
962 path, normed, ignoremissing, exists, self._map.dirfoldmap |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
963 ) |
13717
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
964 return folded |
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
965 |
16542
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16509
diff
changeset
|
966 def normalize(self, path, isknown=False, ignoremissing=False): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
967 """ |
13717
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
968 normalize the case of a pathname when on a casefolding filesystem |
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
969 |
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
970 isknown specifies whether the filename came from walking the |
16542
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16509
diff
changeset
|
971 disk, to avoid extra filesystem access. |
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16509
diff
changeset
|
972 |
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16509
diff
changeset
|
973 If ignoremissing is True, missing path are returned |
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16509
diff
changeset
|
974 unchanged. Otherwise, we try harder to normalize possibly |
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16509
diff
changeset
|
975 existing path components. |
13717
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
976 |
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
977 The normalized case is determined based on the following precedence: |
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
978 |
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
979 - version of name already stored in the dirstate |
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
980 - version of name stored on disk |
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
981 - version provided via command arguments |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
982 """ |
13717
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
983 |
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
984 if self._checkcase: |
16542
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16509
diff
changeset
|
985 return self._normalize(path, isknown, ignoremissing) |
13717
bc41d08a5ccc
dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents:
13400
diff
changeset
|
986 return path |
6677
9865e15febd0
Add a normalize() method to dirstate
Paul Moore <p.f.moore@gmail.com>
parents:
6675
diff
changeset
|
987 |
50114
c175b4857498
dirstate: add a comment about the semantic of `dirstate.clear`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50109
diff
changeset
|
988 # XXX this method is barely used, as a result: |
c175b4857498
dirstate: add a comment about the semantic of `dirstate.clear`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50109
diff
changeset
|
989 # - its semantic is unclear |
c175b4857498
dirstate: add a comment about the semantic of `dirstate.clear`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50109
diff
changeset
|
990 # - do we really needs it ? |
50115
62f633f751a4
dirstate: mark `clear` and `rebuild` as `require_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50114
diff
changeset
|
991 @requires_changing_parents |
5065
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
992 def clear(self): |
34933
0217f75b6e59
dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents:
34678
diff
changeset
|
993 self._map.clear() |
5123 | 994 self._dirty = True |
5065
b304c2496f52
dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4953
diff
changeset
|
995 |
50115
62f633f751a4
dirstate: mark `clear` and `rebuild` as `require_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50114
diff
changeset
|
996 @requires_changing_parents |
18760
e74704c33e24
strip: make --keep option not set all dirstate times to 0
Durham Goode <durham@fb.com>
parents:
18663
diff
changeset
|
997 def rebuild(self, parent, allfiles, changedfiles=None): |
49357
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
998 matcher = self._sparsematcher |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
999 if matcher is not None and not matcher.always(): |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1000 # should not add non-matching files |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1001 allfiles = [f for f in allfiles if matcher(f)] |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1002 if changedfiles: |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1003 changedfiles = [f for f in changedfiles if matcher(f)] |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1004 |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1005 if changedfiles is not None: |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1006 # these files will be deleted from the dirstate when they are |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1007 # not found to be in allfiles |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1008 dirstatefilestoremove = {f for f in self if not matcher(f)} |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1009 changedfiles = dirstatefilestoremove.union(changedfiles) |
5b7a10ddb42f
sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49356
diff
changeset
|
1010 |
25448
2bbfc2042d93
dirstate: avoid invalidating every entries when list is empty
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25275
diff
changeset
|
1011 if changedfiles is None: |
27176
54ace3372f84
dirstate: change debugrebuilddirstate --minimal to use dirstate.rebuild
Christian Delahousse <cdelahousse@fb.com>
parents:
27016
diff
changeset
|
1012 # Rebuild entire dirstate |
43891
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1013 to_lookup = allfiles |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1014 to_drop = [] |
27176
54ace3372f84
dirstate: change debugrebuilddirstate --minimal to use dirstate.rebuild
Christian Delahousse <cdelahousse@fb.com>
parents:
27016
diff
changeset
|
1015 self.clear() |
43891
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1016 elif len(changedfiles) < 10: |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1017 # Avoid turning allfiles into a set, which can be expensive if it's |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1018 # large. |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1019 to_lookup = [] |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1020 to_drop = [] |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1021 for f in changedfiles: |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1022 if f in allfiles: |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1023 to_lookup.append(f) |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1024 else: |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1025 to_drop.append(f) |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1026 else: |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1027 changedfilesset = set(changedfiles) |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1028 to_lookup = changedfilesset & set(allfiles) |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1029 to_drop = changedfilesset - to_lookup |
27176
54ace3372f84
dirstate: change debugrebuilddirstate --minimal to use dirstate.rebuild
Christian Delahousse <cdelahousse@fb.com>
parents:
27016
diff
changeset
|
1030 |
29772
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1031 if self._origpl is None: |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1032 self._origpl = self._pl |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
1033 self._map.setparents(parent, self._nodeconstants.nullid) |
43891
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1034 |
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1035 for f in to_lookup: |
47992
14fa2e583422
dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47991
diff
changeset
|
1036 if self.in_merge: |
14fa2e583422
dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47991
diff
changeset
|
1037 self.set_tracked(f) |
14fa2e583422
dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47991
diff
changeset
|
1038 else: |
14fa2e583422
dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47991
diff
changeset
|
1039 self._map.reset_state( |
14fa2e583422
dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47991
diff
changeset
|
1040 f, |
14fa2e583422
dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47991
diff
changeset
|
1041 wc_tracked=True, |
14fa2e583422
dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47991
diff
changeset
|
1042 p1_tracked=True, |
14fa2e583422
dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47991
diff
changeset
|
1043 ) |
43891
7eb6a2680ae6
dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents:
43869
diff
changeset
|
1044 for f in to_drop: |
48000
1370d695c258
dirstate: use `reset_state` in `rebuild` instead of `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47999
diff
changeset
|
1045 self._map.reset_state(f) |
30026
ba06562a06a2
dirstate: rebuild should update dirstate properly
Mateusz Kwapich <mitrandir@fb.com>
parents:
29889
diff
changeset
|
1046 |
4903
81078e177266
dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents:
4677
diff
changeset
|
1047 self._dirty = True |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
1048 |
50255
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1049 def _setup_tr_abort(self, tr): |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1050 """make sure we invalidate the current change on abort""" |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1051 if tr is None: |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1052 return |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1053 |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1054 def on_abort(tr): |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1055 self._attached_to_a_transaction = False |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1056 self.invalidate() |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1057 |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1058 tr.addabort( |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1059 b'dirstate-invalidate%s' % self._tr_key_suffix, |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1060 on_abort, |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1061 ) |
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1062 |
29673
52ff07e1de91
deprecation: enforce thew 'tr' argument of 'dirstate.write' (API)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29351
diff
changeset
|
1063 def write(self, tr): |
4612
17ee7407097f
dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents:
4611
diff
changeset
|
1064 if not self._dirty: |
1794
98b6c1cad58b
only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1755
diff
changeset
|
1065 return |
50121
15531d101313
dirstate: add small asserts for double security
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50120
diff
changeset
|
1066 # make sure we don't request a write of invalidated content |
15531d101313
dirstate: add small asserts for double security
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50120
diff
changeset
|
1067 # XXX move before the dirty check once `unlock` stop calling `write` |
15531d101313
dirstate: add small asserts for double security
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50120
diff
changeset
|
1068 assert not self._invalidated_context |
21931
89b809fa6cef
dirstate: delay writing out to ensure timestamp of each entries explicitly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21810
diff
changeset
|
1069 |
48793
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
1070 write_key = self._use_tracked_hint and self._dirty_tracked_set |
29673
52ff07e1de91
deprecation: enforce thew 'tr' argument of 'dirstate.write' (API)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29351
diff
changeset
|
1071 if tr: |
50122
72b4d9284411
dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50121
diff
changeset
|
1072 |
50255
fa04407bda7a
dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50254
diff
changeset
|
1073 self._setup_tr_abort(tr) |
50122
72b4d9284411
dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50121
diff
changeset
|
1074 self._attached_to_a_transaction = True |
72b4d9284411
dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50121
diff
changeset
|
1075 |
72b4d9284411
dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50121
diff
changeset
|
1076 def on_success(f): |
72b4d9284411
dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50121
diff
changeset
|
1077 self._attached_to_a_transaction = False |
72b4d9284411
dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50121
diff
changeset
|
1078 self._writedirstate(tr, f), |
72b4d9284411
dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50121
diff
changeset
|
1079 |
26634
09bb1ee7e73e
dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26633
diff
changeset
|
1080 # delay writing in-memory changes out |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1081 tr.addfilegenerator( |
50123
4e95341c89aa
dirstate: distinct transaction callback from largefile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50122
diff
changeset
|
1082 b'dirstate-1-main%s' % self._tr_key_suffix, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1083 (self._filename,), |
50122
72b4d9284411
dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50121
diff
changeset
|
1084 on_success, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1085 location=b'plain', |
48685
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
1086 post_finalize=True, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1087 ) |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1088 if write_key: |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1089 tr.addfilegenerator( |
50123
4e95341c89aa
dirstate: distinct transaction callback from largefile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50122
diff
changeset
|
1090 b'dirstate-2-key-post%s' % self._tr_key_suffix, |
48793
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
1091 (self._filename_th,), |
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
1092 lambda f: self._write_tracked_hint(tr, f), |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1093 location=b'plain', |
48685
21ac6aedd5e5
transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48684
diff
changeset
|
1094 post_finalize=True, |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1095 ) |
26634
09bb1ee7e73e
dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26633
diff
changeset
|
1096 return |
09bb1ee7e73e
dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26633
diff
changeset
|
1097 |
48682
cdb0d857afe2
dirstate: use a context manager when writing the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48531
diff
changeset
|
1098 file = lambda f: self._opener(f, b"w", atomictemp=True, checkambig=True) |
cdb0d857afe2
dirstate: use a context manager when writing the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48531
diff
changeset
|
1099 with file(self._filename) as f: |
cdb0d857afe2
dirstate: use a context manager when writing the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48531
diff
changeset
|
1100 self._writedirstate(tr, f) |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1101 if write_key: |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1102 # we update the key-file after writing to make sure reader have a |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1103 # key that match the newly written content |
48793
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
1104 with file(self._filename_th) as f: |
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
1105 self._write_tracked_hint(tr, f) |
26521
3f41e28a16d8
dirstate: split write to write changes into files other than .hg/dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26492
diff
changeset
|
1106 |
48793
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
1107 def delete_tracked_hint(self): |
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
1108 """remove the tracked_hint file |
48790
5ba24e886cec
tracked-key: make it possible to upgrade to and downgrade from the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48685
diff
changeset
|
1109 |
5ba24e886cec
tracked-key: make it possible to upgrade to and downgrade from the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48685
diff
changeset
|
1110 To be used by format downgrades operation""" |
48793
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
1111 self._opener.unlink(self._filename_th) |
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
1112 self._use_tracked_hint = False |
48790
5ba24e886cec
tracked-key: make it possible to upgrade to and downgrade from the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48685
diff
changeset
|
1113 |
29772
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1114 def addparentchangecallback(self, category, callback): |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1115 """add a callback to be called when the wd parents are changed |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1116 |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1117 Callback will be called with the following arguments: |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1118 dirstate, (oldp1, oldp2), (newp1, newp2) |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1119 |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1120 Category is a unique identifier to allow overwriting an old callback |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1121 with a newer callback. |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1122 """ |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1123 self._plchangecallbacks[category] = callback |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1124 |
48393
1a8a70b4b0ad
dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48392
diff
changeset
|
1125 def _writedirstate(self, tr, st): |
50121
15531d101313
dirstate: add small asserts for double security
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50120
diff
changeset
|
1126 # make sure we don't write invalidated content |
15531d101313
dirstate: add small asserts for double security
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50120
diff
changeset
|
1127 assert not self._invalidated_context |
29772
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1128 # notify callbacks about parents change |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1129 if self._origpl is not None and self._origpl != self._pl: |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
1130 for c, callback in sorted(self._plchangecallbacks.items()): |
29772
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1131 callback(self, self._origpl, self._pl) |
2ebd507e5ac3
dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents:
29673
diff
changeset
|
1132 self._origpl = None |
48393
1a8a70b4b0ad
dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48392
diff
changeset
|
1133 self._map.write(tr, st) |
34673
e2214632c3a2
dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents:
34672
diff
changeset
|
1134 self._dirty = False |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1135 self._dirty_tracked_set = False |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1136 |
48793
6e559391f96e
tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48790
diff
changeset
|
1137 def _write_tracked_hint(self, tr, f): |
48684
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1138 key = node.hex(uuid.uuid4().bytes) |
568f63b5a30f
dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48683
diff
changeset
|
1139 f.write(b"1\n%s\n" % key) # 1 is the format version |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
1140 |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
1141 def _dirignore(self, f): |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
1142 if self._ignore(f): |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
1143 return True |
43633
0b7733719d21
utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43620
diff
changeset
|
1144 for p in pathutil.finddirs(f): |
6767
80605a8127e0
dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
1145 if self._ignore(p): |
6032
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
1146 return True |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
1147 return False |
b41f0d6a74fc
dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5516
diff
changeset
|
1148 |
27594
0921caca7703
dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents:
27593
diff
changeset
|
1149 def _ignorefiles(self): |
0921caca7703
dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents:
27593
diff
changeset
|
1150 files = [] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1151 if os.path.exists(self._join(b'.hgignore')): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1152 files.append(self._join(b'.hgignore')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1153 for name, path in self._ui.configitems(b"ui"): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1154 if name == b'ignore' or name.startswith(b'ignore.'): |
27594
0921caca7703
dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents:
27593
diff
changeset
|
1155 # we need to use os.path.join here rather than self._join |
0921caca7703
dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents:
27593
diff
changeset
|
1156 # because path is arbitrary and user-specified |
0921caca7703
dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents:
27593
diff
changeset
|
1157 files.append(os.path.join(self._rootdir, util.expandpath(path))) |
0921caca7703
dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents:
27593
diff
changeset
|
1158 return files |
0921caca7703
dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents:
27593
diff
changeset
|
1159 |
27670
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1160 def _ignorefileandline(self, f): |
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1161 files = collections.deque(self._ignorefiles()) |
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1162 visited = set() |
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1163 while files: |
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1164 i = files.popleft() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1165 patterns = matchmod.readpatternfile( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1166 i, self._ui.warn, sourceinfo=True |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1167 ) |
27670
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1168 for pattern, lineno, line in patterns: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1169 kind, p = matchmod._patsplit(pattern, b'glob') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1170 if kind == b"subinclude": |
27670
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1171 if p not in visited: |
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1172 files.append(p) |
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1173 continue |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1174 m = matchmod.match( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1175 self._root, b'', [], [pattern], warn=self._ui.warn |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1176 ) |
27670
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1177 if m(f): |
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1178 return (i, lineno, line) |
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1179 visited.add(i) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1180 return (None, -1, b"") |
27670
4374f039d269
dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents:
27594
diff
changeset
|
1181 |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1182 def _walkexplicit(self, match, subrepos): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
1183 """Get stat data about the files explicitly specified by match. |
3529 | 1184 |
19174
022256ef47b8
dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents:
19173
diff
changeset
|
1185 Return a triple (results, dirsfound, dirsnotfound). |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1186 - results is a mapping from filename to stat result. It also contains |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1187 listings mapping subrepos and .hg to None. |
19174
022256ef47b8
dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents:
19173
diff
changeset
|
1188 - dirsfound is a list of files found to be directories. |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1189 - dirsnotfound is a list of files that the dirstate thinks are |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
1190 directories and that were not found.""" |
6578
f242d3684f83
walk: begin refactoring badmatch handling
Matt Mackall <mpm@selenic.com>
parents:
6577
diff
changeset
|
1191 |
8681
26f133267cd7
walk: use match.bad callback for filetype messages
Matt Mackall <mpm@selenic.com>
parents:
8680
diff
changeset
|
1192 def badtype(mode): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1193 kind = _(b'unknown') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1194 if stat.S_ISCHR(mode): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1195 kind = _(b'character device') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1196 elif stat.S_ISBLK(mode): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1197 kind = _(b'block device') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1198 elif stat.S_ISFIFO(mode): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1199 kind = _(b'fifo') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1200 elif stat.S_ISSOCK(mode): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1201 kind = _(b'socket') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1202 elif stat.S_ISDIR(mode): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1203 kind = _(b'directory') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1204 return _(b'unsupported file type (type is %s)') % kind |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
1205 |
8676
acd69fc201a5
walk: we always have a badfn
Matt Mackall <mpm@selenic.com>
parents:
8675
diff
changeset
|
1206 badfn = match.bad |
6831
2b663f542bd3
dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents:
6830
diff
changeset
|
1207 dmap = self._map |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
1208 lstat = os.lstat |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
1209 getkind = stat.S_IFMT |
6828
55d65a33da52
dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents:
6827
diff
changeset
|
1210 dirkind = stat.S_IFDIR |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
1211 regkind = stat.S_IFREG |
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
1212 lnkkind = stat.S_IFLNK |
6831
2b663f542bd3
dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents:
6830
diff
changeset
|
1213 join = self._join |
19174
022256ef47b8
dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents:
19173
diff
changeset
|
1214 dirsfound = [] |
022256ef47b8
dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents:
19173
diff
changeset
|
1215 foundadd = dirsfound.append |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1216 dirsnotfound = [] |
19175
63f7bd2e1a46
dirstate._walkexplicit: inline dirsnotfound.append
Siddharth Agarwal <sid0@fb.com>
parents:
19174
diff
changeset
|
1217 notfoundadd = dirsnotfound.append |
6820
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
1218 |
24448
55c449345b10
match: add isexact() method to hide internals
Martin von Zweigbergk <martinvonz@google.com>
parents:
24212
diff
changeset
|
1219 if not match.isexact() and self._checkcase: |
12907
e255a5dc29e6
dirstate: skip optimization on case-folding FS (issue2440)
Matt Mackall <mpm@selenic.com>
parents:
12401
diff
changeset
|
1220 normalize = self._normalize |
e255a5dc29e6
dirstate: skip optimization on case-folding FS (issue2440)
Matt Mackall <mpm@selenic.com>
parents:
12401
diff
changeset
|
1221 else: |
18032
a9e623bb440e
dirstate: test normalize is truthy instead of using a no-op lambda
Siddharth Agarwal <sid0@fb.com>
parents:
18018
diff
changeset
|
1222 normalize = None |
12907
e255a5dc29e6
dirstate: skip optimization on case-folding FS (issue2440)
Matt Mackall <mpm@selenic.com>
parents:
12401
diff
changeset
|
1223 |
12211
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
1224 files = sorted(match.files()) |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
1225 subrepos.sort() |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
1226 i, j = 0, 0 |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
1227 while i < len(files) and j < len(subrepos): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1228 subpath = subrepos[j] + b"/" |
13233
0b30e6148ec5
subrepo: do not report known files inside repositories as unknown
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents:
12907
diff
changeset
|
1229 if files[i] < subpath: |
12211
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
1230 i += 1 |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
1231 continue |
13339
22167be007ed
subrepo: fix pruning of subrepo filenames in dirstate (issue2619)
trbs <trbs@trbs.net>
parents:
13233
diff
changeset
|
1232 while i < len(files) and files[i].startswith(subpath): |
12211
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
1233 del files[i] |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
1234 j += 1 |
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
1235 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1236 if not files or b'' in files: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1237 files = [b''] |
42340
7ada598941d2
dirstate: move special handling of files==['.'] together
Martin von Zweigbergk <martinvonz@google.com>
parents:
42304
diff
changeset
|
1238 # constructing the foldmap is expensive, so don't do it for the |
42341
27d6956d386b
match: use '' instead of '.' for root directory (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
42340
diff
changeset
|
1239 # common case where files is [''] |
42340
7ada598941d2
dirstate: move special handling of files==['.'] together
Martin von Zweigbergk <martinvonz@google.com>
parents:
42304
diff
changeset
|
1240 normalize = None |
10176
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
10145
diff
changeset
|
1241 results = dict.fromkeys(subrepos) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1242 results[b'.hg'] = None |
5000
46facb73ba8b
dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents:
4965
diff
changeset
|
1243 |
12211
798d72f3621c
dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
1244 for ff in files: |
42340
7ada598941d2
dirstate: move special handling of files==['.'] together
Martin von Zweigbergk <martinvonz@google.com>
parents:
42304
diff
changeset
|
1245 if normalize: |
24522
18085e46caa9
dirstate._walkexplicit: drop normpath calls
Siddharth Agarwal <sid0@fb.com>
parents:
24521
diff
changeset
|
1246 nf = normalize(ff, False, True) |
18032
a9e623bb440e
dirstate: test normalize is truthy instead of using a no-op lambda
Siddharth Agarwal <sid0@fb.com>
parents:
18018
diff
changeset
|
1247 else: |
24522
18085e46caa9
dirstate._walkexplicit: drop normpath calls
Siddharth Agarwal <sid0@fb.com>
parents:
24521
diff
changeset
|
1248 nf = ff |
6829
fec1da46006e
dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents:
6828
diff
changeset
|
1249 if nf in results: |
6820
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
1250 continue |
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
1251 |
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
1252 try: |
6831
2b663f542bd3
dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents:
6830
diff
changeset
|
1253 st = lstat(join(nf)) |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
1254 kind = getkind(st.st_mode) |
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
1255 if kind == dirkind: |
8588
2624f485b9bc
dirstate: set more states in step 1 of walk
Simon Heimberg <simohe@besonet.ch>
parents:
8521
diff
changeset
|
1256 if nf in dmap: |
21115
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1257 # file replaced by dir on disk but still in dirstate |
8588
2624f485b9bc
dirstate: set more states in step 1 of walk
Simon Heimberg <simohe@besonet.ch>
parents:
8521
diff
changeset
|
1258 results[nf] = None |
24537
2bb13f2b778c
dirstate: don't require exact case when adding dirs on icasefs (issue4578)
Matt Harbison <matt_harbison@yahoo.com>
parents:
24198
diff
changeset
|
1259 foundadd((nf, ff)) |
12401
4cdaf1adafc8
backout most of 4f8067c94729
Matt Mackall <mpm@selenic.com>
parents:
12387
diff
changeset
|
1260 elif kind == regkind or kind == lnkkind: |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
1261 results[nf] = st |
6828
55d65a33da52
dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents:
6827
diff
changeset
|
1262 else: |
8681
26f133267cd7
walk: use match.bad callback for filetype messages
Matt Mackall <mpm@selenic.com>
parents:
8680
diff
changeset
|
1263 badfn(ff, badtype(kind)) |
6830
2cf4cda64727
dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents:
6829
diff
changeset
|
1264 if nf in dmap: |
6829
fec1da46006e
dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents:
6828
diff
changeset
|
1265 results[nf] = None |
50021
4e955a7a6a55
dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50011
diff
changeset
|
1266 except (OSError) as inst: |
4e955a7a6a55
dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50011
diff
changeset
|
1267 # nf not found on disk - it is dirstate only |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1268 if nf in dmap: # does it exactly match a missing file? |
8675
fb74e1e69da0
walk: simplify check for missing file
Matt Mackall <mpm@selenic.com>
parents:
8645
diff
changeset
|
1269 results[nf] = None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1270 else: # does it match a missing directory? |
35084
61888bd0b300
dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents:
35083
diff
changeset
|
1271 if self._map.hasdir(nf): |
23375
a179db3db9b9
dirstate: speed up repeated missing directory checks
Martin von Zweigbergk <martinvonz@google.com>
parents:
22915
diff
changeset
|
1272 notfoundadd(nf) |
8677
34df078b8b1b
walk: simplify logic for badfn clause
Matt Mackall <mpm@selenic.com>
parents:
8676
diff
changeset
|
1273 else: |
34022
d5b2beca16c0
python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents:
33981
diff
changeset
|
1274 badfn(ff, encoding.strtolocal(inst.strerror)) |
6820
639d9cb95509
dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents:
6819
diff
changeset
|
1275 |
36200
deb851914fd7
dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents:
35895
diff
changeset
|
1276 # match.files() may contain explicitly-specified paths that shouldn't |
deb851914fd7
dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents:
35895
diff
changeset
|
1277 # be taken; drop them from the list of files found. dirsfound/notfound |
deb851914fd7
dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents:
35895
diff
changeset
|
1278 # aren't filtered here because they will be tested later. |
deb851914fd7
dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents:
35895
diff
changeset
|
1279 if match.anypats(): |
deb851914fd7
dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents:
35895
diff
changeset
|
1280 for f in list(results): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1281 if f == b'.hg' or f in subrepos: |
36200
deb851914fd7
dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents:
35895
diff
changeset
|
1282 # keep sentinel to disable further out-of-repo walks |
deb851914fd7
dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents:
35895
diff
changeset
|
1283 continue |
deb851914fd7
dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents:
35895
diff
changeset
|
1284 if not match(f): |
deb851914fd7
dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents:
35895
diff
changeset
|
1285 del results[f] |
deb851914fd7
dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents:
35895
diff
changeset
|
1286 |
25877
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1287 # Case insensitive filesystems cannot rely on lstat() failing to detect |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1288 # a case-only rename. Prune the stat object for any file that does not |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1289 # match the case in the filesystem, if there are multiple files that |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1290 # normalize to the same path. |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1291 if match.isexact() and self._checkcase: |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1292 normed = {} |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1293 |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
1294 for f, st in results.items(): |
25877
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1295 if st is None: |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1296 continue |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1297 |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1298 nc = util.normcase(f) |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1299 paths = normed.get(nc) |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1300 |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1301 if paths is None: |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1302 paths = set() |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1303 normed[nc] = paths |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1304 |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1305 paths.add(f) |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1306 |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
1307 for norm, paths in normed.items(): |
25877
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1308 if len(paths) > 1: |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1309 for path in paths: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1310 folded = self._discoverpath( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1311 path, norm, True, None, self._map.dirfoldmap |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1312 ) |
25877
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1313 if path != folded: |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1314 results[path] = None |
85785cd3b69f
dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents:
25660
diff
changeset
|
1315 |
19174
022256ef47b8
dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents:
19173
diff
changeset
|
1316 return results, dirsfound, dirsnotfound |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1317 |
19190
b03952ee634d
dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents:
19175
diff
changeset
|
1318 def walk(self, match, subrepos, unknown, ignored, full=True): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
1319 """ |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1320 Walk recursively through the directory tree, finding all files |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1321 matched by match. |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1322 |
19190
b03952ee634d
dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents:
19175
diff
changeset
|
1323 If full is False, maybe skip some known-clean files. |
b03952ee634d
dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents:
19175
diff
changeset
|
1324 |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1325 Return a dict mapping filename to stat-like object (either |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1326 mercurial.osutil.stat instance or return value of os.stat()). |
19190
b03952ee634d
dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents:
19175
diff
changeset
|
1327 |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
1328 """ |
19190
b03952ee634d
dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents:
19175
diff
changeset
|
1329 # full is a flag that extensions that hook into walk can use -- this |
b03952ee634d
dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents:
19175
diff
changeset
|
1330 # implementation doesn't use it at all. This satisfies the contract |
b03952ee634d
dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents:
19175
diff
changeset
|
1331 # because we only guarantee a "maybe". |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1332 |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1333 if ignored: |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1334 ignore = util.never |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1335 dirignore = util.never |
21115
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1336 elif unknown: |
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1337 ignore = self._ignore |
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1338 dirignore = self._dirignore |
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1339 else: |
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1340 # if not unknown and not ignored, drop dir recursion and step 2 |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1341 ignore = util.always |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1342 dirignore = util.always |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1343 |
49356
a87443d4aec0
sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49355
diff
changeset
|
1344 if self._sparsematchfn is not None: |
a87443d4aec0
sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49355
diff
changeset
|
1345 em = matchmod.exact(match.files()) |
a87443d4aec0
sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49355
diff
changeset
|
1346 sm = matchmod.unionmatcher([self._sparsematcher, em]) |
a87443d4aec0
sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49355
diff
changeset
|
1347 match = matchmod.intersectmatchers(match, sm) |
a87443d4aec0
sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49355
diff
changeset
|
1348 |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1349 matchfn = match.matchfn |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1350 matchalways = match.always() |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1351 matchtdir = match.traversedir |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1352 dmap = self._map |
32208
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32177
diff
changeset
|
1353 listdir = util.listdir |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1354 lstat = os.lstat |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1355 dirkind = stat.S_IFDIR |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1356 regkind = stat.S_IFREG |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1357 lnkkind = stat.S_IFLNK |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1358 join = self._join |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1359 |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1360 exact = skipstep3 = False |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1361 if match.isexact(): # match.exact |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1362 exact = True |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1363 dirignore = util.always # skip step 2 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1364 elif match.prefix(): # match.match, no patterns |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1365 skipstep3 = True |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1366 |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1367 if not exact and self._checkcase: |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1368 normalize = self._normalize |
24541
e235b5dc5cf9
dirstate.walk: use the file foldmap to normalize
Siddharth Agarwal <sid0@fb.com>
parents:
24540
diff
changeset
|
1369 normalizefile = self._normalizefile |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1370 skipstep3 = False |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1371 else: |
24560
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1372 normalize = self._normalize |
24541
e235b5dc5cf9
dirstate.walk: use the file foldmap to normalize
Siddharth Agarwal <sid0@fb.com>
parents:
24540
diff
changeset
|
1373 normalizefile = None |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1374 |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1375 # step 1: find all explicit files |
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1376 results, work, dirsnotfound = self._walkexplicit(match, subrepos) |
43713
95d2eab0a7b9
dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents:
43696
diff
changeset
|
1377 if matchtdir: |
95d2eab0a7b9
dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents:
43696
diff
changeset
|
1378 for d in work: |
95d2eab0a7b9
dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents:
43696
diff
changeset
|
1379 matchtdir(d[0]) |
95d2eab0a7b9
dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents:
43696
diff
changeset
|
1380 for d in dirsnotfound: |
95d2eab0a7b9
dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents:
43696
diff
changeset
|
1381 matchtdir(d) |
19173
ec70a78a70e0
dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents:
19172
diff
changeset
|
1382 |
19172
c6cea2e2031b
dirstate.walk: pull skipstep3 out of the explicit walk code
Siddharth Agarwal <sid0@fb.com>
parents:
19171
diff
changeset
|
1383 skipstep3 = skipstep3 and not (work or dirsnotfound) |
24537
2bb13f2b778c
dirstate: don't require exact case when adding dirs on icasefs (issue4578)
Matt Harbison <matt_harbison@yahoo.com>
parents:
24198
diff
changeset
|
1384 work = [d for d in work if not dirignore(d[0])] |
19171
252de7b77cfd
dirstate.walk: move dirignore filter out of explicit walk code
Siddharth Agarwal <sid0@fb.com>
parents:
19170
diff
changeset
|
1385 |
6826
eca20fee0728
dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents:
6825
diff
changeset
|
1386 # step 2: visit subdirectories |
24560
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1387 def traverse(work, alreadynormed): |
24559
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1388 wadd = work.append |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1389 while work: |
43239
6fcdcea2b03a
dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
1390 tracing.counter('dirstate.walk work', len(work)) |
24560
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1391 nd = work.pop() |
38956
a3cabe9415e1
dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents:
36995
diff
changeset
|
1392 visitentries = match.visitchildrenset(nd) |
a3cabe9415e1
dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents:
36995
diff
changeset
|
1393 if not visitentries: |
32177
8f1a2b848b52
dirstate: optimize walk() by using match.visitdir()
Martin von Zweigbergk <martinvonz@google.com>
parents:
31547
diff
changeset
|
1394 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1395 if visitentries == b'this' or visitentries == b'all': |
38956
a3cabe9415e1
dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents:
36995
diff
changeset
|
1396 visitentries = None |
24559
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1397 skip = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1398 if nd != b'': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1399 skip = b'.hg' |
24559
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1400 try: |
43239
6fcdcea2b03a
dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
1401 with tracing.log('dirstate.walk.traverse listdir %s', nd): |
6fcdcea2b03a
dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
1402 entries = listdir(join(nd), stat=True, skip=skip) |
49310
050dc8730858
py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents:
49306
diff
changeset
|
1403 except (PermissionError, FileNotFoundError) as inst: |
050dc8730858
py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents:
49306
diff
changeset
|
1404 match.bad( |
050dc8730858
py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents:
49306
diff
changeset
|
1405 self.pathto(nd), encoding.strtolocal(inst.strerror) |
050dc8730858
py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents:
49306
diff
changeset
|
1406 ) |
050dc8730858
py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents:
49306
diff
changeset
|
1407 continue |
24559
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1408 for f, kind, st in entries: |
39260
27946fca8a05
match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents:
38959
diff
changeset
|
1409 # Some matchers may return files in the visitentries set, |
27946fca8a05
match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents:
38959
diff
changeset
|
1410 # instead of 'this', if the matcher explicitly mentions them |
27946fca8a05
match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents:
38959
diff
changeset
|
1411 # and is not an exactmatcher. This is acceptable; we do not |
27946fca8a05
match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents:
38959
diff
changeset
|
1412 # make any hard assumptions about file-or-directory below |
27946fca8a05
match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents:
38959
diff
changeset
|
1413 # based on the presence of `f` in visitentries. If |
27946fca8a05
match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents:
38959
diff
changeset
|
1414 # visitchildrenset returned a set, we can always skip the |
27946fca8a05
match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents:
38959
diff
changeset
|
1415 # entries *not* in the set it provided regardless of whether |
27946fca8a05
match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents:
38959
diff
changeset
|
1416 # they're actually a file or a directory. |
38956
a3cabe9415e1
dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents:
36995
diff
changeset
|
1417 if visitentries and f not in visitentries: |
a3cabe9415e1
dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents:
36995
diff
changeset
|
1418 continue |
24559
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1419 if normalizefile: |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1420 # even though f might be a directory, we're only |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1421 # interested in comparing it to files currently in the |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1422 # dmap -- therefore normalizefile is enough |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1423 nf = normalizefile( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1424 nd and (nd + b"/" + f) or f, True, True |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1425 ) |
24559
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1426 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1427 nf = nd and (nd + b"/" + f) or f |
24559
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1428 if nf not in results: |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1429 if kind == dirkind: |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1430 if not ignore(nf): |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1431 if matchtdir: |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1432 matchtdir(nf) |
24560
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1433 wadd(nf) |
24559
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1434 if nf in dmap and (matchalways or matchfn(nf)): |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1435 results[nf] = None |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1436 elif kind == regkind or kind == lnkkind: |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1437 if nf in dmap: |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1438 if matchalways or matchfn(nf): |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1439 results[nf] = st |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1440 elif (matchalways or matchfn(nf)) and not ignore( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1441 nf |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1442 ): |
24560
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1443 # unknown file -- normalize if necessary |
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1444 if not alreadynormed: |
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1445 nf = normalize(nf, False, True) |
24559
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1446 results[nf] = st |
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1447 elif nf in dmap and (matchalways or matchfn(nf)): |
6829
fec1da46006e
dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents:
6828
diff
changeset
|
1448 results[nf] = None |
24559
4728d6f7c69f
dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents:
24553
diff
changeset
|
1449 |
24560
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1450 for nd, d in work: |
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1451 # alreadynormed means that processwork doesn't have to do any |
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1452 # expensive directory normalization |
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1453 alreadynormed = not normalize or nd == d |
b38bcf18993c
dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents:
24559
diff
changeset
|
1454 traverse([d], alreadynormed) |
536 | 1455 |
18812
1c40526da52a
dirstate.walk: remove subrepo and .hg from results before step 3
Siddharth Agarwal <sid0@fb.com>
parents:
18792
diff
changeset
|
1456 for s in subrepos: |
1c40526da52a
dirstate.walk: remove subrepo and .hg from results before step 3
Siddharth Agarwal <sid0@fb.com>
parents:
18792
diff
changeset
|
1457 del results[s] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1458 del results[b'.hg'] |
18812
1c40526da52a
dirstate.walk: remove subrepo and .hg from results before step 3
Siddharth Agarwal <sid0@fb.com>
parents:
18792
diff
changeset
|
1459 |
21115
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1460 # step 3: visit remaining files from dmap |
8684
5bb7780b57c7
match: fold plan cases down to two special cases
Matt Mackall <mpm@selenic.com>
parents:
8683
diff
changeset
|
1461 if not skipstep3 and not exact: |
21115
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1462 # If a dmap file is not in results yet, it was either |
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1463 # a) not matching matchfn b) ignored, c) missing, or d) under a |
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1464 # symlink directory. |
18815
a18919de61e5
dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents:
18814
diff
changeset
|
1465 if not results and matchalways: |
31422
2e38a88bbc6c
dirstate: use list comprehension to get a list of keys
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31278
diff
changeset
|
1466 visit = [f for f in dmap] |
18815
a18919de61e5
dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents:
18814
diff
changeset
|
1467 else: |
a18919de61e5
dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents:
18814
diff
changeset
|
1468 visit = [f for f in dmap if f not in results and matchfn(f)] |
a18919de61e5
dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents:
18814
diff
changeset
|
1469 visit.sort() |
a18919de61e5
dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents:
18814
diff
changeset
|
1470 |
18625
2cbd27f4f3c4
dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents:
18567
diff
changeset
|
1471 if unknown: |
21115
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1472 # unknown == True means we walked all dirs under the roots |
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1473 # that wasn't ignored, and everything that matched was stat'ed |
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1474 # and is already in results. |
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1475 # The rest must thus be ignored or under a symlink. |
33649
377e8ddaebef
pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents:
33440
diff
changeset
|
1476 audit_path = pathutil.pathauditor(self._root, cached=True) |
18625
2cbd27f4f3c4
dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents:
18567
diff
changeset
|
1477 |
2cbd27f4f3c4
dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents:
18567
diff
changeset
|
1478 for nf in iter(visit): |
24621
1784ca148392
dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents:
24537
diff
changeset
|
1479 # If a stat for the same file was already added with a |
1784ca148392
dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents:
24537
diff
changeset
|
1480 # different case, don't add one for this, since that would |
1784ca148392
dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents:
24537
diff
changeset
|
1481 # make it appear as if the file exists under both names |
1784ca148392
dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents:
24537
diff
changeset
|
1482 # on disk. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1483 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1484 normalizefile |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1485 and normalizefile(nf, True, True) in results |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1486 ): |
24621
1784ca148392
dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents:
24537
diff
changeset
|
1487 results[nf] = None |
18625
2cbd27f4f3c4
dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents:
18567
diff
changeset
|
1488 # Report ignored items in the dmap as long as they are not |
2cbd27f4f3c4
dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents:
18567
diff
changeset
|
1489 # under a symlink directory. |
24621
1784ca148392
dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents:
24537
diff
changeset
|
1490 elif audit_path.check(nf): |
18663
05cf40f9b0ec
dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents:
18653
diff
changeset
|
1491 try: |
05cf40f9b0ec
dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents:
18653
diff
changeset
|
1492 results[nf] = lstat(join(nf)) |
21115
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1493 # file was just ignored, no links, and exists |
18663
05cf40f9b0ec
dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents:
18653
diff
changeset
|
1494 except OSError: |
05cf40f9b0ec
dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents:
18653
diff
changeset
|
1495 # file doesn't exist |
05cf40f9b0ec
dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents:
18653
diff
changeset
|
1496 results[nf] = None |
18625
2cbd27f4f3c4
dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents:
18567
diff
changeset
|
1497 else: |
2cbd27f4f3c4
dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents:
18567
diff
changeset
|
1498 # It's either missing or under a symlink directory |
21115
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1499 # which we in this case report as missing |
18625
2cbd27f4f3c4
dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents:
18567
diff
changeset
|
1500 results[nf] = None |
2cbd27f4f3c4
dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents:
18567
diff
changeset
|
1501 else: |
2cbd27f4f3c4
dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents:
18567
diff
changeset
|
1502 # We may not have walked the full directory tree above, |
21115
1b6e37f44250
dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents:
21026
diff
changeset
|
1503 # so stat and check everything we missed. |
31507
4d1dd9cf0dca
dirstate: use future-proof next(iter) instead of iter.next
Augie Fackler <augie@google.com>
parents:
31422
diff
changeset
|
1504 iv = iter(visit) |
26984
af2663680e95
dirstate: back out 502b56a9e897
Bryan O'Sullivan <bos@serpentine.com>
parents:
26887
diff
changeset
|
1505 for st in util.statfiles([join(i) for i in visit]): |
31507
4d1dd9cf0dca
dirstate: use future-proof next(iter) instead of iter.next
Augie Fackler <augie@google.com>
parents:
31422
diff
changeset
|
1506 results[next(iv)] = st |
6829
fec1da46006e
dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents:
6828
diff
changeset
|
1507 return results |
669
8aa2a282eda4
.hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents:
667
diff
changeset
|
1508 |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1509 def _rust_status(self, matcher, list_clean, list_ignored, list_unknown): |
49361
c2092612c424
sparse: use the rust code even when sparse is present
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49360
diff
changeset
|
1510 if self._sparsematchfn is not None: |
c2092612c424
sparse: use the rust code even when sparse is present
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49360
diff
changeset
|
1511 em = matchmod.exact(matcher.files()) |
c2092612c424
sparse: use the rust code even when sparse is present
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49360
diff
changeset
|
1512 sm = matchmod.unionmatcher([self._sparsematcher, em]) |
c2092612c424
sparse: use the rust code even when sparse is present
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49360
diff
changeset
|
1513 matcher = matchmod.intersectmatchers(matcher, sm) |
44078
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1514 # Force Rayon (Rust parallelism library) to respect the number of |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1515 # workers. This is a temporary workaround until Rust code knows |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1516 # how to read the config file. |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1517 numcpus = self._ui.configint(b"worker", b"numcpus") |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1518 if numcpus is not None: |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1519 encoding.environ.setdefault(b'RAYON_NUM_THREADS', b'%d' % numcpus) |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1520 |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1521 workers_enabled = self._ui.configbool(b"worker", b"enabled", True) |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1522 if not workers_enabled: |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1523 encoding.environ[b"RAYON_NUM_THREADS"] = b"1" |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1524 |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1525 ( |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1526 lookup, |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1527 modified, |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1528 added, |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1529 removed, |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1530 deleted, |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1531 clean, |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1532 ignored, |
44078
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1533 unknown, |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1534 warnings, |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1535 bad, |
44840
4ba2a6ffcf24
status: also support for `traversedir` callback in the Rust fast-path
Raphaël Gomès <rgomes@octobus.net>
parents:
44836
diff
changeset
|
1536 traversed, |
47350
04d1f17f49e7
dirstate-v2: Write .hg/dirstate back to disk on directory cache changes
Simon Sapin <simon.sapin@octobus.net>
parents:
47320
diff
changeset
|
1537 dirty, |
44078
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1538 ) = rustmod.status( |
48121
5fc2dfb073d6
dirstatemap: rename `_rustmap` to `_map`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48107
diff
changeset
|
1539 self._map._map, |
44078
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1540 matcher, |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1541 self._rootdir, |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1542 self._ignorefiles(), |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1543 self._checkexec, |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1544 bool(list_clean), |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1545 bool(list_ignored), |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1546 bool(list_unknown), |
44840
4ba2a6ffcf24
status: also support for `traversedir` callback in the Rust fast-path
Raphaël Gomès <rgomes@octobus.net>
parents:
44836
diff
changeset
|
1547 bool(matcher.traversedir), |
44078
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1548 ) |
44840
4ba2a6ffcf24
status: also support for `traversedir` callback in the Rust fast-path
Raphaël Gomès <rgomes@octobus.net>
parents:
44836
diff
changeset
|
1549 |
47350
04d1f17f49e7
dirstate-v2: Write .hg/dirstate back to disk on directory cache changes
Simon Sapin <simon.sapin@octobus.net>
parents:
47320
diff
changeset
|
1550 self._dirty |= dirty |
04d1f17f49e7
dirstate-v2: Write .hg/dirstate back to disk on directory cache changes
Simon Sapin <simon.sapin@octobus.net>
parents:
47320
diff
changeset
|
1551 |
44840
4ba2a6ffcf24
status: also support for `traversedir` callback in the Rust fast-path
Raphaël Gomès <rgomes@octobus.net>
parents:
44836
diff
changeset
|
1552 if matcher.traversedir: |
4ba2a6ffcf24
status: also support for `traversedir` callback in the Rust fast-path
Raphaël Gomès <rgomes@octobus.net>
parents:
44836
diff
changeset
|
1553 for dir in traversed: |
4ba2a6ffcf24
status: also support for `traversedir` callback in the Rust fast-path
Raphaël Gomès <rgomes@octobus.net>
parents:
44836
diff
changeset
|
1554 matcher.traversedir(dir) |
4ba2a6ffcf24
status: also support for `traversedir` callback in the Rust fast-path
Raphaël Gomès <rgomes@octobus.net>
parents:
44836
diff
changeset
|
1555 |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1556 if self._ui.warn: |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1557 for item in warnings: |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1558 if isinstance(item, tuple): |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1559 file_path, syntax = item |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1560 msg = _(b"%s: ignoring invalid syntax '%s'\n") % ( |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1561 file_path, |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1562 syntax, |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1563 ) |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1564 self._ui.warn(msg) |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1565 else: |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1566 msg = _(b"skipping unreadable pattern file '%s': %s\n") |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1567 self._ui.warn( |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1568 msg |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1569 % ( |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1570 pathutil.canonpath( |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1571 self._rootdir, self._rootdir, item |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1572 ), |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1573 b"No such file or directory", |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1574 ) |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1575 ) |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1576 |
50021
4e955a7a6a55
dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50011
diff
changeset
|
1577 for fn, message in bad: |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1578 matcher.bad(fn, encoding.strtolocal(message)) |
44078
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1579 |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1580 status = scmutil.status( |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1581 modified=modified, |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1582 added=added, |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1583 removed=removed, |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1584 deleted=deleted, |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1585 unknown=unknown, |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1586 ignored=ignored, |
44078
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1587 clean=clean, |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1588 ) |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1589 return (lookup, status) |
f2c350e7371e
dirstate: move rust fast-path calling code to its own method
Raphaël Gomès <rgomes@octobus.net>
parents:
43917
diff
changeset
|
1590 |
10176
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
10145
diff
changeset
|
1591 def status(self, match, subrepos, ignored, clean, unknown): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
1592 """Determine the status of the working copy relative to the |
22915
4d680deb0d9e
status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22913
diff
changeset
|
1593 dirstate and return a pair of (unsure, status), where status is of type |
4d680deb0d9e
status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22913
diff
changeset
|
1594 scmutil.status and: |
9518
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
1595 |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
1596 unsure: |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
1597 files that might have been modified since the dirstate was |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
1598 written, but need to be read to be sure (size is the same |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
1599 but mtime differs) |
22915
4d680deb0d9e
status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22913
diff
changeset
|
1600 status.modified: |
9518
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
1601 files that have definitely been modified since the dirstate |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
1602 was written (different size or mode) |
22915
4d680deb0d9e
status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22913
diff
changeset
|
1603 status.clean: |
9518
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
1604 files that have definitely not been modified since the |
bc19a0b04e83
dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents:
9509
diff
changeset
|
1605 dirstate was written |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
1606 """ |
50149
03decaaf1eff
dirstate: enforce `running_status` context for calling `status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50148
diff
changeset
|
1607 if not self._running_status: |
03decaaf1eff
dirstate: enforce `running_status` context for calling `status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50148
diff
changeset
|
1608 msg = "Calling `status` outside a `running_status` context" |
03decaaf1eff
dirstate: enforce `running_status` context for calling `status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50148
diff
changeset
|
1609 raise error.ProgrammingError(msg) |
6753
ed5ffb2c12f3
repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents:
6750
diff
changeset
|
1610 listignored, listclean, listunknown = ignored, clean, unknown |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2008
diff
changeset
|
1611 lookup, modified, added, unknown, ignored = [], [], [], [], [] |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2486
diff
changeset
|
1612 removed, deleted, clean = [], [], [] |
723 | 1613 |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
1614 dmap = self._map |
34935
ffeea2406276
dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents:
34934
diff
changeset
|
1615 dmap.preload() |
43274
733d4ffcd667
rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43239
diff
changeset
|
1616 |
733d4ffcd667
rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43239
diff
changeset
|
1617 use_rust = True |
43917
40fd1ef4e4c1
rust-matchers: add support for `exactmatcher` in `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43891
diff
changeset
|
1618 |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1619 allowed_matchers = ( |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1620 matchmod.alwaysmatcher, |
49479
6193e846cb65
rust-status: expose DifferenceMatcher from Rust to Python
Raphaël Gomès <rgomes@octobus.net>
parents:
49467
diff
changeset
|
1621 matchmod.differencematcher, |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1622 matchmod.exactmatcher, |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1623 matchmod.includematcher, |
49350
0b00998e336a
rust-dirstate: add `intersectionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents:
49348
diff
changeset
|
1624 matchmod.intersectionmatcher, |
49351
97dcd6906e6f
rust-dirstate: add support for nevermatcher
Raphaël Gomès <rgomes@octobus.net>
parents:
49350
diff
changeset
|
1625 matchmod.nevermatcher, |
49348
0043c7aa3250
rust-dirstate: add `unionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents:
49310
diff
changeset
|
1626 matchmod.unionmatcher, |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1627 ) |
43917
40fd1ef4e4c1
rust-matchers: add support for `exactmatcher` in `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43891
diff
changeset
|
1628 |
43274
733d4ffcd667
rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43239
diff
changeset
|
1629 if rustmod is None: |
733d4ffcd667
rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43239
diff
changeset
|
1630 use_rust = False |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1631 elif self._checkcase: |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1632 # Case-insensitive filesystems are not handled yet |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1633 use_rust = False |
43274
733d4ffcd667
rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43239
diff
changeset
|
1634 elif subrepos: |
733d4ffcd667
rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43239
diff
changeset
|
1635 use_rust = False |
43917
40fd1ef4e4c1
rust-matchers: add support for `exactmatcher` in `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43891
diff
changeset
|
1636 elif not isinstance(match, allowed_matchers): |
44836
63edfea7dfde
status: update comment to reflect the more recent situation
Raphaël Gomès <rgomes@octobus.net>
parents:
44801
diff
changeset
|
1637 # Some matchers have yet to be implemented |
43274
733d4ffcd667
rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43239
diff
changeset
|
1638 use_rust = False |
733d4ffcd667
rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43239
diff
changeset
|
1639 |
48390
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1640 # Get the time from the filesystem so we can disambiguate files that |
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1641 # appear modified in the present or future. |
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1642 try: |
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1643 mtime_boundary = timestamp.get_fs_now(self._opener) |
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1644 except OSError: |
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1645 # In largefiles or readonly context |
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1646 mtime_boundary = None |
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1647 |
43274
733d4ffcd667
rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43239
diff
changeset
|
1648 if use_rust: |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1649 try: |
48390
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1650 res = self._rust_status( |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1651 match, listclean, listignored, listunknown |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1652 ) |
48390
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1653 return res + (mtime_boundary,) |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1654 except rustmod.FallbackError: |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1655 pass |
43274
733d4ffcd667
rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
43239
diff
changeset
|
1656 |
43620
dd773340a085
dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
43612
diff
changeset
|
1657 def noop(f): |
dd773340a085
dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
43612
diff
changeset
|
1658 pass |
dd773340a085
dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
43612
diff
changeset
|
1659 |
34935
ffeea2406276
dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents:
34934
diff
changeset
|
1660 dcontains = dmap.__contains__ |
ffeea2406276
dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents:
34934
diff
changeset
|
1661 dget = dmap.__getitem__ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1662 ladd = lookup.append # aka "unsure" |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
1663 madd = modified.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
1664 aadd = added.append |
43620
dd773340a085
dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
43612
diff
changeset
|
1665 uadd = unknown.append if listunknown else noop |
dd773340a085
dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
43612
diff
changeset
|
1666 iadd = ignored.append if listignored else noop |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
1667 radd = removed.append |
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
1668 dadd = deleted.append |
43620
dd773340a085
dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
43612
diff
changeset
|
1669 cadd = clean.append if listclean else noop |
18034
1a570f04de07
dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents:
18032
diff
changeset
|
1670 mexact = match.exact |
1a570f04de07
dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents:
18032
diff
changeset
|
1671 dirignore = self._dirignore |
1a570f04de07
dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents:
18032
diff
changeset
|
1672 checkexec = self._checkexec |
48291
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1673 checklink = self._checklink |
34336
0865d25e8a8a
dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents:
34335
diff
changeset
|
1674 copymap = self._map.copymap |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
1675 |
19191
ab9de1e8fc36
dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents:
19190
diff
changeset
|
1676 # We need to do full walks when either |
ab9de1e8fc36
dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents:
19190
diff
changeset
|
1677 # - we're listing all clean files, or |
ab9de1e8fc36
dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents:
19190
diff
changeset
|
1678 # - match.traversedir does something, because match.traversedir should |
ab9de1e8fc36
dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents:
19190
diff
changeset
|
1679 # be called for every dir in the working dir |
ab9de1e8fc36
dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents:
19190
diff
changeset
|
1680 full = listclean or match.traversedir is not None |
48922
fe056166b40d
dirstate: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48913
diff
changeset
|
1681 for fn, st in self.walk( |
fe056166b40d
dirstate: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48913
diff
changeset
|
1682 match, subrepos, listunknown, listignored, full=full |
fe056166b40d
dirstate: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48913
diff
changeset
|
1683 ).items(): |
34935
ffeea2406276
dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents:
34934
diff
changeset
|
1684 if not dcontains(fn): |
18034
1a570f04de07
dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents:
18032
diff
changeset
|
1685 if (listignored or mexact(fn)) and dirignore(fn): |
6753
ed5ffb2c12f3
repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents:
6750
diff
changeset
|
1686 if listignored: |
6033
a1ebd5cd7e55
dirstate.status: avoid putting ignored files in the unknown list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6032
diff
changeset
|
1687 iadd(fn) |
19910
601944f41257
dirstate.status: return explicit unknown files even when not asked
Siddharth Agarwal <sid0@fb.com>
parents:
19651
diff
changeset
|
1688 else: |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
1689 uadd(fn) |
1471
f56f38a1a85f
rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
1690 continue |
6591
eda3fd322a7f
dirstate: minor status cleanups
Matt Mackall <mpm@selenic.com>
parents:
6590
diff
changeset
|
1691 |
34935
ffeea2406276
dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents:
34934
diff
changeset
|
1692 t = dget(fn) |
47536
8e4b9fe31334
dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47535
diff
changeset
|
1693 mode = t.mode |
47537
0e5800c88eb4
dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47536
diff
changeset
|
1694 size = t.size |
6591
eda3fd322a7f
dirstate: minor status cleanups
Matt Mackall <mpm@selenic.com>
parents:
6590
diff
changeset
|
1695 |
47531
f5b8f0b9c129
dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47530
diff
changeset
|
1696 if not st and t.tracked: |
6818
6e93fbd847ef
dirstate.walk: eliminate src from yield
Matt Mackall <mpm@selenic.com>
parents:
6811
diff
changeset
|
1697 dadd(fn) |
48148
e2753a7acfa7
dirstate-item: use the `p2_info` property to replace more verbose call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48147
diff
changeset
|
1698 elif t.p2_info: |
47533
174d0bcce2eb
dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
1699 madd(fn) |
174d0bcce2eb
dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
1700 elif t.added: |
174d0bcce2eb
dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
1701 aadd(fn) |
174d0bcce2eb
dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
1702 elif t.removed: |
174d0bcce2eb
dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47532
diff
changeset
|
1703 radd(fn) |
47534
e53a42dce923
dirstate: drop last explicite `state` usage in status
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47533
diff
changeset
|
1704 elif t.tracked: |
48291
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1705 if not checklink and t.has_fallback_symlink: |
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1706 # If the file system does not support symlink, the mode |
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1707 # might not be correctly stored in the dirstate, so do not |
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1708 # trust it. |
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1709 ladd(fn) |
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1710 elif not checkexec and t.has_fallback_exec: |
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1711 # If the file system does not support exec bits, the mode |
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1712 # might not be correctly stored in the dirstate, so do not |
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1713 # trust it. |
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1714 ladd(fn) |
500260410bb8
dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48290
diff
changeset
|
1715 elif ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1716 size >= 0 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1717 and ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1718 (size != st.st_size and size != st.st_size & _rangemask) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1719 or ((mode ^ st.st_mode) & 0o100 and checkexec) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1720 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1721 or fn in copymap |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1722 ): |
46703
ca69e29a2a30
formatting: fix redundant parentheses
Raphaël Gomès <rgomes@octobus.net>
parents:
46678
diff
changeset
|
1723 if stat.S_ISLNK(st.st_mode) and size != st.st_size: |
46678
0d055849d5f9
enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents:
45942
diff
changeset
|
1724 # issue6456: Size returned may be longer due to |
0d055849d5f9
enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents:
45942
diff
changeset
|
1725 # encryption on EXT-4 fscrypt, undecided. |
0d055849d5f9
enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents:
45942
diff
changeset
|
1726 ladd(fn) |
0d055849d5f9
enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents:
45942
diff
changeset
|
1727 else: |
0d055849d5f9
enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents:
45942
diff
changeset
|
1728 madd(fn) |
48260
269ff8978086
dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents:
48252
diff
changeset
|
1729 elif not t.mtime_likely_equal_to(timestamp.mtime_of(st)): |
48391
b80e5e75d51e
dirstate: remove `lastnormaltime` mechanism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48390
diff
changeset
|
1730 # There might be a change in the future if for example the |
b80e5e75d51e
dirstate: remove `lastnormaltime` mechanism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48390
diff
changeset
|
1731 # internal clock is off, but this is a case where the issues |
b80e5e75d51e
dirstate: remove `lastnormaltime` mechanism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48390
diff
changeset
|
1732 # the user would face would be a lot worse and there is |
b80e5e75d51e
dirstate: remove `lastnormaltime` mechanism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48390
diff
changeset
|
1733 # nothing we can really do. |
13704
a464763e99f1
dirstate: avoid a race with multiple commits in the same process
Greg Ward <greg@gerg.ca>
parents:
13400
diff
changeset
|
1734 ladd(fn) |
6753
ed5ffb2c12f3
repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents:
6750
diff
changeset
|
1735 elif listclean: |
5003
4b1acb3ecb3c
dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents:
5002
diff
changeset
|
1736 cadd(fn) |
44530
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1737 status = scmutil.status( |
4d1634e59f13
rust-status: use bare hg status fastpath from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
44357
diff
changeset
|
1738 modified, added, removed, deleted, unknown, ignored, clean |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1739 ) |
48390
322525db4c98
status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48387
diff
changeset
|
1740 return (lookup, status, mtime_boundary) |
21984
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1741 |
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1742 def matches(self, match): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
1743 """ |
21984
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1744 return files in the dirstate (in whatever state) filtered by match |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45243
diff
changeset
|
1745 """ |
21984
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1746 dmap = self._map |
44357
bed8d08cfcb2
rust-dirstatemap: remove additional lookup in dirstate.matches
Raphaël Gomès <rgomes@octobus.net>
parents:
44297
diff
changeset
|
1747 if rustmod is not None: |
48121
5fc2dfb073d6
dirstatemap: rename `_rustmap` to `_map`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48107
diff
changeset
|
1748 dmap = self._map._map |
44357
bed8d08cfcb2
rust-dirstatemap: remove additional lookup in dirstate.matches
Raphaël Gomès <rgomes@octobus.net>
parents:
44297
diff
changeset
|
1749 |
21984
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1750 if match.always(): |
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1751 return dmap.keys() |
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1752 files = match.files() |
24448
55c449345b10
match: add isexact() method to hide internals
Martin von Zweigbergk <martinvonz@google.com>
parents:
24212
diff
changeset
|
1753 if match.isexact(): |
21984
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1754 # fast path -- filter the other way around, since typically files is |
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1755 # much smaller than dmap |
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1756 return [f for f in files if f in dmap] |
25275
d94e403b5237
dirstate: use match.prefix() instead of 'not match.anypats()'
Martin von Zweigbergk <martinvonz@google.com>
parents:
25234
diff
changeset
|
1757 if match.prefix() and all(fn in dmap for fn in files): |
21984
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1758 # fast path -- all the values are known to be files, so just return |
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1759 # that |
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1760 return list(files) |
977a0b9af5ac
dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents:
21931
diff
changeset
|
1761 return [f for f in dmap if match(f)] |
26632
59b5e8844eb0
dirstate: move code paths for backup from dirstateguard to dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26630
diff
changeset
|
1762 |
50084
5b9c3ae807c8
localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50077
diff
changeset
|
1763 def all_file_names(self): |
5b9c3ae807c8
localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50077
diff
changeset
|
1764 """list all filename currently used by this dirstate |
26633
020b12d591f3
dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26632
diff
changeset
|
1765 |
50084
5b9c3ae807c8
localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50077
diff
changeset
|
1766 This is only used to do `hg rollback` related backup in the transaction |
5b9c3ae807c8
localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50077
diff
changeset
|
1767 """ |
50267
f92afdf3cff9
transaction: remove the `branch` backup for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50266
diff
changeset
|
1768 files = [b'branch'] |
f92afdf3cff9
transaction: remove the `branch` backup for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50266
diff
changeset
|
1769 if self._opener.exists(self._filename): |
f92afdf3cff9
transaction: remove the `branch` backup for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50266
diff
changeset
|
1770 files.append(self._filename) |
f92afdf3cff9
transaction: remove the `branch` backup for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50266
diff
changeset
|
1771 if self._use_dirstate_v2: |
f92afdf3cff9
transaction: remove the `branch` backup for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50266
diff
changeset
|
1772 files.append(self._map.docket.data_filename()) |
f92afdf3cff9
transaction: remove the `branch` backup for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50266
diff
changeset
|
1773 return tuple(files) |
26633
020b12d591f3
dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26632
diff
changeset
|
1774 |
49827
d09a57ce6fc4
verify: print short `p1` node in relevant dirstate messages
Raphaël Gomès <rgomes@octobus.net>
parents:
49824
diff
changeset
|
1775 def verify(self, m1, m2, p1, narrow_matcher=None): |
49823
2715c8549f4b
dirstate: update messages in verify to not use the old `state` API
Raphaël Gomès <rgomes@octobus.net>
parents:
49822
diff
changeset
|
1776 """ |
2715c8549f4b
dirstate: update messages in verify to not use the old `state` API
Raphaël Gomès <rgomes@octobus.net>
parents:
49822
diff
changeset
|
1777 check the dirstate contents against the parent manifest and yield errors |
2715c8549f4b
dirstate: update messages in verify to not use the old `state` API
Raphaël Gomès <rgomes@octobus.net>
parents:
49822
diff
changeset
|
1778 """ |
2715c8549f4b
dirstate: update messages in verify to not use the old `state` API
Raphaël Gomès <rgomes@octobus.net>
parents:
49822
diff
changeset
|
1779 missing_from_p1 = _( |
49827
d09a57ce6fc4
verify: print short `p1` node in relevant dirstate messages
Raphaël Gomès <rgomes@octobus.net>
parents:
49824
diff
changeset
|
1780 b"%s marked as tracked in p1 (%s) but not in manifest1\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42927
diff
changeset
|
1781 ) |
49823
2715c8549f4b
dirstate: update messages in verify to not use the old `state` API
Raphaël Gomès <rgomes@octobus.net>
parents:
49822
diff
changeset
|
1782 unexpected_in_p1 = _(b"%s marked as added, but also in manifest1\n") |
2715c8549f4b
dirstate: update messages in verify to not use the old `state` API
Raphaël Gomès <rgomes@octobus.net>
parents:
49822
diff
changeset
|
1783 missing_from_ps = _( |
2715c8549f4b
dirstate: update messages in verify to not use the old `state` API
Raphaël Gomès <rgomes@octobus.net>
parents:
49822
diff
changeset
|
1784 b"%s marked as modified, but not in either manifest\n" |
2715c8549f4b
dirstate: update messages in verify to not use the old `state` API
Raphaël Gomès <rgomes@octobus.net>
parents:
49822
diff
changeset
|
1785 ) |
2715c8549f4b
dirstate: update messages in verify to not use the old `state` API
Raphaël Gomès <rgomes@octobus.net>
parents:
49822
diff
changeset
|
1786 missing_from_ds = _( |
49827
d09a57ce6fc4
verify: print short `p1` node in relevant dirstate messages
Raphaël Gomès <rgomes@octobus.net>
parents:
49824
diff
changeset
|
1787 b"%s in manifest1, but not marked as tracked in p1 (%s)\n" |
49823
2715c8549f4b
dirstate: update messages in verify to not use the old `state` API
Raphaël Gomès <rgomes@octobus.net>
parents:
49822
diff
changeset
|
1788 ) |
48089
c87844960a35
dirstate: move verification code within the dirstate itself
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48085
diff
changeset
|
1789 for f, entry in self.items(): |
49821
8f200511cdc7
dirstate: stop using `entry.state()` for logic in `verify`
Raphaël Gomès <rgomes@octobus.net>
parents:
49479
diff
changeset
|
1790 if entry.p1_tracked: |
8f200511cdc7
dirstate: stop using `entry.state()` for logic in `verify`
Raphaël Gomès <rgomes@octobus.net>
parents:
49479
diff
changeset
|
1791 if entry.modified and f not in m1 and f not in m2: |
49824
fdd227585d5a
verify: format messages directly at the source
Raphaël Gomès <rgomes@octobus.net>
parents:
49823
diff
changeset
|
1792 yield missing_from_ps % f |
49821
8f200511cdc7
dirstate: stop using `entry.state()` for logic in `verify`
Raphaël Gomès <rgomes@octobus.net>
parents:
49479
diff
changeset
|
1793 elif f not in m1: |
49827
d09a57ce6fc4
verify: print short `p1` node in relevant dirstate messages
Raphaël Gomès <rgomes@octobus.net>
parents:
49824
diff
changeset
|
1794 yield missing_from_p1 % (f, node.short(p1)) |
49821
8f200511cdc7
dirstate: stop using `entry.state()` for logic in `verify`
Raphaël Gomès <rgomes@octobus.net>
parents:
49479
diff
changeset
|
1795 if entry.added and f in m1: |
49824
fdd227585d5a
verify: format messages directly at the source
Raphaël Gomès <rgomes@octobus.net>
parents:
49823
diff
changeset
|
1796 yield unexpected_in_p1 % f |
48089
c87844960a35
dirstate: move verification code within the dirstate itself
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48085
diff
changeset
|
1797 for f in m1: |
49822
1d8721be2428
dirstate: add narrow support to `verify`
Raphaël Gomès <rgomes@octobus.net>
parents:
49821
diff
changeset
|
1798 if narrow_matcher is not None and not narrow_matcher(f): |
1d8721be2428
dirstate: add narrow support to `verify`
Raphaël Gomès <rgomes@octobus.net>
parents:
49821
diff
changeset
|
1799 continue |
49821
8f200511cdc7
dirstate: stop using `entry.state()` for logic in `verify`
Raphaël Gomès <rgomes@octobus.net>
parents:
49479
diff
changeset
|
1800 entry = self.get_entry(f) |
8f200511cdc7
dirstate: stop using `entry.state()` for logic in `verify`
Raphaël Gomès <rgomes@octobus.net>
parents:
49479
diff
changeset
|
1801 if not entry.p1_tracked: |
49827
d09a57ce6fc4
verify: print short `p1` node in relevant dirstate messages
Raphaël Gomès <rgomes@octobus.net>
parents:
49824
diff
changeset
|
1802 yield missing_from_ds % (f, node.short(p1)) |