annotate mercurial/dirstate.py @ 51921:3a90a6fd710d

dirstate: subclass the new dirstate Protocol class Behold the chaos that ensues. We'll use the generated *.pyi files to apply type annotations to the interface, and see how much agrees with the documentation. Since the CamelCase name was used to try to work around pytype issues with zope interfaces and is a new innovation this cycle (see c1d7ac70980b), drop the CamelCase name. I think the Protocol classes *should* be CamelCase, but that can be done later in one pass. For now, the CamelCase alias is extra noise in the *.pyi files.
author Matt Harbison <matt_harbison@yahoo.com>
date Thu, 26 Sep 2024 18:52:46 -0400
parents f4733654f144
children 93d872a06132
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9678
diff changeset
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
51859
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51805
diff changeset
8 from __future__ import annotations
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
9
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
10 import collections
32346
73e67c4386ec dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents: 32208
diff changeset
11 import contextlib
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
12 import os
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
13 import stat
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
14 import uuid
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
15
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
16 from .i18n import _
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 )
d459cd8ea42d interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents: 42755
diff changeset
41
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43505
diff changeset
42 parsers = policy.importmod('parsers')
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43505
diff changeset
43 rustmod = policy.importrust('dirstate')
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32352
diff changeset
44
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
45 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
46
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
47 propertycache = util.propertycache
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
48 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
49 _rangemask = dirstatemap.rangemask
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
50
48044
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
51 DirstateItem = dirstatemap.DirstateItem
21808
7537e57f5dbd dirstate: add dirstatetuple to create dirstate values
Siddharth Agarwal <sid0@fb.com>
parents: 21116
diff changeset
52
47482
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47481
diff changeset
53
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
54 class repocache(filecache):
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
55 """filecache for files in .hg/"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
56
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
57 def join(self, obj, fname):
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
58 return obj._opener.join(fname)
4610
274c99fc629f dirstate: simplify state()
Matt Mackall <mpm@selenic.com>
parents: 4609
diff changeset
59
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
60
16202
53e2cd303ecf dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents: 16201
diff changeset
61 class rootcache(filecache):
53e2cd303ecf dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents: 16201
diff changeset
62 """filecache for files in the repository root"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
63
16202
53e2cd303ecf dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents: 16201
diff changeset
64 def join(self, obj, fname):
53e2cd303ecf dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents: 16201
diff changeset
65 return obj._join(fname)
53e2cd303ecf dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents: 16201
diff changeset
66
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
67
50118
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
68 def check_invalidated(func):
50156
7e6c5cfaba6a dirstate: phase-divergent update to 65943224c184
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50155
diff changeset
69 """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
70
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
71 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
72 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
73 such change.
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
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
76 def wrap(self, *args, **kwargs):
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
77 if self._invalidated_context:
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
78 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
79 msg %= func.__name__
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
80 raise error.ProgrammingError(msg)
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
81 return func(self, *args, **kwargs)
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
82
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
83 return wrap
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
84
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
85
49963
23b70ce09e55 dirstate: rename `@requires_parents_change` to `@requires_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49962
diff changeset
86 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
87 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
88 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
89 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
90 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
91 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
92 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
93
50118
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
94 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
95
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
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
97 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
98 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
99 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
100 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
101 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
102 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
103 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
104
50118
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
105 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
106
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
50108
f7981f202b7a dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50106
diff changeset
108 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
109 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
110 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
111 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
112 msg %= func.__name__
f7981f202b7a dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50106
diff changeset
113 raise error.ProgrammingError(msg)
f7981f202b7a dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50106
diff changeset
114 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
115
50118
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
116 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
117
f7981f202b7a dirstate: add a `require_changing_any` decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50106
diff changeset
118
50152
e9379b55ed80 dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50149
diff changeset
119 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
120 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
121 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
122 msg = (
e9379b55ed80 dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50149
diff changeset
123 '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
124 '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
125 )
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
126 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
127 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
128 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
129
50118
65943224c184 dirstate: introduce a check_invalidated decorator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50117
diff changeset
130 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
131
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
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
133 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
134 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
135
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
136
51921
3a90a6fd710d dirstate: subclass the new dirstate Protocol class
Matt Harbison <matt_harbison@yahoo.com>
parents: 51859
diff changeset
137 class dirstate(intdirstate.idirstate):
50157
fbb4c7117cf1 dirstate: phase-divergent update to 4e95341c89aa
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50156
diff changeset
138 # 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
139 _tr_key_suffix = b''
4e95341c89aa dirstate: distinct transaction callback from largefile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50122
diff changeset
140
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
141 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
142 self,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
143 opener,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
144 ui,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
145 root,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
146 validate,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
147 sparsematchfn,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
148 nodeconstants,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
149 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
150 use_tracked_hint=False,
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
151 ):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
152 """Create a new dirstate object.
10145
aec936051734 dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents: 9678
diff changeset
153
aec936051734 dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents: 9678
diff changeset
154 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
155 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
156 the dirstate.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
157 """
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
158 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
159 self._use_tracked_hint = use_tracked_hint
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
160 self._nodeconstants = nodeconstants
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
161 self._opener = opener
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 12907
diff changeset
162 self._validate = validate
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
163 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
164 # 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
165 self._sparsematchfn = sparsematchfn
24198
3cc630be5f09 dirstate: make sure rootdir ends with directory separator (issue4557)
Yuya Nishihara <yuya@tcha.org>
parents: 23866
diff changeset
166 # 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
167 # 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
168 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
169 # 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
170 self._dirty = False
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
171 # 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
172 self._dirty_tracked_set = False
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
173 self._ui = ui
16200
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16143
diff changeset
174 self._filecache = {}
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
175 # 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
176 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
177 # the change currently underway
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
178 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
179 # 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
180 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
181 # 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
182 # 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
183 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
184 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
185 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
186 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
187 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
188 self._plchangecallbacks = {}
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
189 self._origpl = None
47501
8b7e47802deb dirstate: split dirstatemap in its own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47489
diff changeset
190 self._mapcls = dirstatemap.dirstatemap
41674
e178b131906a dirstate: call and cache os.getcwd() in constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 40424
diff changeset
191 # 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
192 # 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
193 # raises an exception).
e178b131906a dirstate: call and cache os.getcwd() in constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 40424
diff changeset
194 self._cwd
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 21984
diff changeset
195
50128
2f60cd6442fd dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50123
diff changeset
196 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
197 # 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
198 # 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
199 # `refresh`.
9fc0d244a753 dirstate: fix a potential traceback when in `copy` and `rename`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
200 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
201 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
202 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
203 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
204 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
205 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
206 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
207
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
208 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
209 """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
210
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44825
diff changeset
211 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
212 """
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44825
diff changeset
213 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
214
32346
73e67c4386ec dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents: 32208
diff changeset
215 @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
216 @check_invalidated
50132
3dd7e54ff7f1 dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50129
diff changeset
217 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
218 """Wrap a status operation
3dd7e54ff7f1 dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50129
diff changeset
219
50144
c6df5349183b dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50132
diff changeset
220 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
221 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
222
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
223 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
224 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
225 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
226
c6df5349183b dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50132
diff changeset
227 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
228 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
229 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
230 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
231
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 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
234
c6df5349183b dirstate: add documentation about the expectation of `running_status` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50132
diff changeset
235 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
236 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
237 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
238 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
239 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
240 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
241 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
242 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
243 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
244 """
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
245 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
246 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
247 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
248 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
249 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
250
8ba5028de859 dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50145
diff changeset
251 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
252
8ba5028de859 dirstate: check that dirstate is clean at the initial context opening
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50145
diff changeset
253 # 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
254 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
255 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
256 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
257 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
258 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
259
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
260 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
261
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
262 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
263 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
264 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
265 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
266 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
267 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
268 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
269 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
270 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
271 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
272 self.invalidate()
50132
3dd7e54ff7f1 dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50129
diff changeset
273
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
274 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
275 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
276 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
277 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
278 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
279 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
280 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
281 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
282
50132
3dd7e54ff7f1 dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50129
diff changeset
283 @contextlib.contextmanager
3dd7e54ff7f1 dirstate: introduce a (noop) running_status context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50129
diff changeset
284 @check_invalidated
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
285 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
286 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
287 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
288 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
289
50077
605f0ccffb43 dirstate: detect potential fishy transaction patterns while changing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50076
diff changeset
290 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
291 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
292 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
293 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
294
50120
a7d11833ff48 dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50119
diff changeset
295 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
296 # 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
297 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
298 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
299 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
300 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
301 msg = (
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
302 '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
303 ' already open'
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
304 )
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
305 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
306 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
307 should_write = False
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
308 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
309 try:
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
310 yield
50105
2323b74f927b dirstate: invalidate on all exceptions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50099
diff changeset
311 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
312 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
313 raise
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
314 finally:
50120
a7d11833ff48 dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50119
diff changeset
315 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
316 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
317 # 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
318 # 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
319 # 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
320 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
321 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
322 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
323 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
324 # 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
325 # have changed.
a7d11833ff48 dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50119
diff changeset
326 self.invalidate()
a7d11833ff48 dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50119
diff changeset
327 else:
a7d11833ff48 dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50119
diff changeset
328 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
329 tr = repo.currenttransaction()
a7d11833ff48 dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50119
diff changeset
330 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
331 if has_tr:
a7d11833ff48 dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50119
diff changeset
332 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
333 else:
a7d11833ff48 dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50119
diff changeset
334 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
335 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
336 if should_write:
a7d11833ff48 dirstate: simplify the invalidation management on context exit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50119
diff changeset
337 self.write(tr)
32346
73e67c4386ec dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents: 32208
diff changeset
338
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
339 @contextlib.contextmanager
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
340 def changing_parents(self, repo):
51066
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
341 """Wrap a dirstate change related to a change of working copy parents
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
342
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
343 This context scopes a series of dirstate modifications that match an
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
344 update of the working copy parents (typically `hg update`, `hg merge`
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
345 etc).
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
346
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
347 The dirstate's methods that perform this kind of modifications require
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
348 this context to be present before being called.
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
349 Such methods are decorated with `@requires_changing_parents`.
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
350
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
351 The new dirstate contents will be written to disk when the top-most
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
352 `changing_parents` context exits successfully. If an exception is
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
353 raised during a `changing_parents` context of any level, all changes
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
354 are invalidated. If this context is open within an open transaction,
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
355 the dirstate writing is delayed until that transaction is successfully
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
356 committed (and the dirstate is invalidated on transaction abort).
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
357
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
358 The `changing_parents` operation is mutually exclusive with the
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
359 `changing_files` one.
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
360 """
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
361 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
362 yield c
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
363
50026
3550e4a88ccd dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50025
diff changeset
364 @contextlib.contextmanager
3550e4a88ccd dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50025
diff changeset
365 def changing_files(self, repo):
51066
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
366 """Wrap a dirstate change related to the set of tracked files
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
367
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
368 This context scopes a series of dirstate modifications that change the
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
369 set of tracked files. (typically `hg add`, `hg remove` etc) or some
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
370 dirstate stored information (like `hg rename --after`) but preserve
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
371 the working copy parents.
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
372
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
373 The dirstate's methods that perform this kind of modifications require
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
374 this context to be present before being called.
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
375 Such methods are decorated with `@requires_changing_files`.
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
376
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
377 The new dirstate contents will be written to disk when the top-most
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
378 `changing_files` context exits successfully. If an exception is raised
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
379 during a `changing_files` context of any level, all changes are
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
380 invalidated. If this context is open within an open transaction, the
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
381 dirstate writing is delayed until that transaction is successfully
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
382 committed (and the dirstate is invalidated on transaction abort).
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
383
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
384 The `changing_files` operation is mutually exclusive with the
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
385 `changing_parents` one.
a63e1f7987a7 dirstate: document the `changing_*` context manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
386 """
50026
3550e4a88ccd dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50025
diff changeset
387 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
388 yield c
3550e4a88ccd dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50025
diff changeset
389
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
390 # 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
391 def parentchange(self):
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
392 msg = (
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
393 "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
394 "`dirstate.changing_parents(repo)`"
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
395 )
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
396 raise error.ProgrammingError(msg)
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
397
50023
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
398 @property
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
399 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
400 """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
401
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
402 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
403 """
50023
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
404 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
405
50022
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
406 @property
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
407 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
408 """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
409 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
410 """
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
411 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
412 return False
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
413 return self._change_type == CHANGE_TYPE_PARENTS
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
414
50026
3550e4a88ccd dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50025
diff changeset
415 @property
3550e4a88ccd dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50025
diff changeset
416 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
417 """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
418 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
419 """
3550e4a88ccd dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50025
diff changeset
420 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
421 return False
3550e4a88ccd dirstate: add a context for tracking files change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50025
diff changeset
422 return self._change_type == CHANGE_TYPE_FILES
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
423
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
424 @propertycache
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
425 def _map(self):
35078
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
426 """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
427 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
428 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
429 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
430 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
431 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
432 self._use_dirstate_v2,
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
433 )
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
434
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
435 @property
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
436 def _sparsematcher(self):
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
437 """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
438
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
439 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
440 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
441 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
442
0540c1628fd4 sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49351
diff changeset
443 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
444 """
49355
0540c1628fd4 sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49351
diff changeset
445 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
446 return None
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
447 # 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
448 # 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
449 # 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
450 return self._sparsematchfn()
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
451
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
452 @repocache(b'branch')
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
453 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
454 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
455 data = b''
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
456 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
457 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
458 data = f.read().strip()
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
459 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
460 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
461 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
462 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
463 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
464 if not data:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
465 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
466 return data
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
467
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
468 @property
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
469 def _pl(self):
34338
0c3e3810cdb6 dirstate: move parent reading to the dirstatemap class
Durham Goode <durham@fb.com>
parents: 34337
diff changeset
470 return self._map.parents()
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
471
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
472 def hasdir(self, d):
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
473 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
474
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
475 @rootcache(b'.hgignore')
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
476 def _ignore(self):
27594
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
477 files = self._ignorefiles()
25216
dc562165044a ignore: use 'include:' rules instead of custom syntax
Durham Goode <durham@fb.com>
parents: 25163
diff changeset
478 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
479 return matchmod.never()
25216
dc562165044a ignore: use 'include:' rules instead of custom syntax
Durham Goode <durham@fb.com>
parents: 25163
diff changeset
480
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
481 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
482 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
483
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
484 @propertycache
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
485 def _slash(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
486 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
487
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
488 @propertycache
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
489 def _checklink(self):
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
490 return util.checklink(self._root)
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
491
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
492 @propertycache
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
493 def _checkexec(self):
44801
373dd22ae60e dirstate: force _checkexec to return a bool
Mitchell Plamann <mplamann@janestreet.com>
parents: 44530
diff changeset
494 return bool(util.checkexec(self._root))
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
495
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
496 @propertycache
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
497 def _checkcase(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
498 return not util.fscasesensitive(self._join(b'.hg'))
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
499
4905
fc61495ea9cf dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
500 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
501 # 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
502 # 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
503 return self._rootdir + f
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
504
15337
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 15057
diff changeset
505 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
506 """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
507
48290
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
508 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
509 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
510 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
511 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
512 """
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
513
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
514 # 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
515 fallback_func = []
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
516
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
517 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
518 entry = None
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
519 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
520 try:
0d6a099bba58 dirstate: group return logic and clarify each function in flagfunc
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48281
diff changeset
521 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
522 except OSError:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
523 return b''
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
524
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
525 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
526 if util.statislink(st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
527 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
528 else:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
529 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
530 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
531 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
532 return b'l'
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
533 else:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
534 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
535 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
536 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
537 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
538 return b'l'
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
539
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
540 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
541 if util.statisexec(st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
542 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
543 else:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
544 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
545 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
546 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
547 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
548 return b'x'
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
549 else:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
550 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
551 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
552 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
553 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
554 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
555 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
556 return b''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
557
48290
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
558 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
559
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
560 @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
561 def _cwd(self):
33215
b7f6885cb055 dirstate: centralize _cwd handling into _cwd method
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32772
diff changeset
562 # internal config: ui.forcecwd
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
563 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
564 if forcecwd:
b7f6885cb055 dirstate: centralize _cwd handling into _cwd method
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32772
diff changeset
565 return forcecwd
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39452
diff changeset
566 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
567
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
568 def getcwd(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
569 """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
570
3d24f31c6b8f dirstate: state that getcwd() shouldn't be used to get real file path
Yuya Nishihara <yuya@tcha.org>
parents: 25877
diff changeset
571 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
572 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
573 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
574 """
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
575 cwd = self._cwd
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
576 if cwd == self._root:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
577 return b''
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
578 # 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
579 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
580 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
581 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
582 if cwd.startswith(rootsep):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
583 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
584 else:
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
585 # 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
586 return cwd
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
587
4525
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4507
diff changeset
588 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
589 if cwd is None:
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4507
diff changeset
590 cwd = self.getcwd()
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
591 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
592 if self._slash:
19210
865beb849720 dirstate: don't overnormalize for ui.slash
Matt Mackall <mpm@selenic.com>
parents: 19128
diff changeset
593 return util.pconvert(path)
4527
b422b558015b Add ui.slash hgrc setting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4525
diff changeset
594 return path
4525
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4507
diff changeset
595
48085
6a78715e56c8 dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
596 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
597 """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
598 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
599 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
600 return DirstateItem()
6a78715e56c8 dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
601 return entry
6a78715e56c8 dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
602
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
603 def __contains__(self, key):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
604 return key in self._map
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
605
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
606 def __iter__(self):
33707
36d216dcae6a dirstate: simplify dirstate's __iter__
Alex Gaynor <agaynor@mozilla.com>
parents: 33440
diff changeset
607 return iter(sorted(self._map))
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
608
32550
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32372
diff changeset
609 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
610 return self._map.items()
18792
10669e24eb6c completion: add a debugpathcomplete command
Bryan O'Sullivan <bryano@fb.com>
parents: 18760
diff changeset
611
32550
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32372
diff changeset
612 iteritems = items
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32372
diff changeset
613
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
614 def parents(self):
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 12907
diff changeset
615 return [self._validate(p) for p in self._pl]
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
616
13876
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
617 def p1(self):
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
618 return self._validate(self._pl[0])
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
619
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
620 def p2(self):
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
621 return self._validate(self._pl[1])
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
622
47510
94c58f3aab56 dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
623 @property
94c58f3aab56 dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
624 def in_merge(self):
94c58f3aab56 dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
625 """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
626 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
627
4179
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
628 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
629 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
630
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
631 @requires_changing_parents
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
632 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
633 """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
634
47513
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47512
diff changeset
635 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
636 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
637 returned by the call.
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16542
diff changeset
638
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16542
diff changeset
639 See localrepo.setparents()
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16542
diff changeset
640 """
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
641 if p2 is None:
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
642 p2 = self._nodeconstants.nullid
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
643 if self._changing_level == 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
644 raise ValueError(
51715
7558cee89655 dirstate: stringify a few exception messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
645 "cannot set dirstate parent outside of "
7558cee89655 dirstate: stringify a few exception messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
646 "dirstate.changing_parents context manager"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
647 )
22407
d259322a394b dirstate: add exception when calling setparent without begin/end (API)
Durham Goode <durham@fb.com>
parents: 22404
diff changeset
648
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
649 self._dirty = True
16509
eab9119c5dee rebase: skip resolved but emptied revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16472
diff changeset
650 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
651 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
652 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
653 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
654 # 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
655 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
656 return self._map.setparents(p1, p2, fold_p2=fold_p2)
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
657
51270
79cd29d598af dirstate: make the `transaction` argument of `setbranch` mandatory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51132
diff changeset
658 def setbranch(self, branch, transaction):
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 39818
diff changeset
659 self.__class__._branch.set(self, encoding.fromlocal(branch))
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
660 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
661 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
662 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
663 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
664 (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
665 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
666 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
667 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
668 )
a6e0b7d4ae9d dirstate: write the `branch` as part of the transaction if any
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50255
diff changeset
669 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
670
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
671 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
672 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
673 self._write_branch(f)
18317
365fecd984c7 dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents: 18078
diff changeset
674 # 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
675 # 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
676 #
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
677 # 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
678 # 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
679 ce = self._filecache[b'_branch']
18317
365fecd984c7 dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents: 18078
diff changeset
680 if ce:
365fecd984c7 dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents: 18078
diff changeset
681 ce.refresh()
4179
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
682
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
683 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
684 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
685
4613
3a645af7fb76 localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents: 4612
diff changeset
686 def invalidate(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
687 """Causes the next access to reread the dirstate.
32682
e696f597d02f dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents: 32605
diff changeset
688
e696f597d02f dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents: 32605
diff changeset
689 This is different from localrepo.invalidatedirstate() because it always
e696f597d02f dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents: 32605
diff changeset
690 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
691 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
692
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43456
diff changeset
693 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
694 if a in self.__dict__:
6b3ed43f77ba dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4952
diff changeset
695 delattr(self, a)
4903
81078e177266 dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents: 4677
diff changeset
696 self._dirty = False
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
697 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
698 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
699 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
700 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
701 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
702 )
29772
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
703 self._origpl = None
4375
109077e7048d When reloading the dirstate, recompute ignore information if needed.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4374
diff changeset
704
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
705 @requires_changing_any
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
706 def copy(self, source, dest):
10145
aec936051734 dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents: 9678
diff changeset
707 """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
708 if source == dest:
deda205a00e1 Ignore dummy copies in dirstate and localrepo.filecommit()
Patrick Mezard <pmezard@gmail.com>
parents: 6479
diff changeset
709 return
4903
81078e177266 dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents: 4677
diff changeset
710 self._dirty = True
7566
5f7e3f17aece mq: drop copy records when refreshing regular patches (issue1441)
Patrick Mezard <pmezard@gmail.com>
parents: 7280
diff changeset
711 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
712 self._check_sparse(source)
34336
0865d25e8a8a dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34335
diff changeset
713 self._map.copymap[dest] = source
48057
62188e4de549 dirstate: drop the `_updatedfiles` set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48055
diff changeset
714 else:
62188e4de549 dirstate: drop the `_updatedfiles` set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48055
diff changeset
715 self._map.copymap.pop(dest, None)
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
716
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
717 def copied(self, file):
34336
0865d25e8a8a dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34335
diff changeset
718 return self._map.copymap.get(file, None)
3154
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
719
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
720 def copies(self):
34336
0865d25e8a8a dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34335
diff changeset
721 return self._map.copymap
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
722
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
723 @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
724 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
725 """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
726
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
727 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
728 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
729
48384
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48379
diff changeset
730 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
731
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
732 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
733 """
47984
6255a0d33c45 dirstate: directly call the right function in `set_tracked`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
734 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
735 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
736 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
737 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
738 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
739 if reset_copy:
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48379
diff changeset
740 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
741 if pre_tracked:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
742 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
743 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
744
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
745 @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
746 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
747 """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
748
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
749 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
750 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
751
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
752 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
753 """
47972
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47971
diff changeset
754 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
755 if ret:
47861
1c797757f5bb dirstate: directly call the dirstatemap in `set_untracked`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47778
diff changeset
756 self._dirty = True
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
757 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
758 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
759
50152
e9379b55ed80 dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50149
diff changeset
760 @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
761 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
762 """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
763 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
764 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
765 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
766 (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
767 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
768
50152
e9379b55ed80 dirstate: enforce context set_clean and set_possibly_dirty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50149
diff changeset
769 @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
770 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
771 """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
772 self._dirty = True
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47719
diff changeset
773 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
774
49963
23b70ce09e55 dirstate: rename `@requires_parents_change` to `@requires_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49962
diff changeset
775 @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
776 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
777 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
778 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
779 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
780 ):
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 """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
782
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
783 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
784 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
785
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
786 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
787 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
788 """
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
789 if self.in_merge:
51715
7558cee89655 dirstate: stringify a few exception messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
790 msg = 'update_file_reference should not be called when merging'
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
791 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
792 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
793 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
794 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
795 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
796 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
797 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
798 # 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
799 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
800 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
801 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
802 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
803 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
804 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
805
47694
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
806 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
807 filename,
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
808 wc_tracked,
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
809 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
810 # 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
811 # 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
812 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
813 )
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
814
49963
23b70ce09e55 dirstate: rename `@requires_parents_change` to `@requires_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49962
diff changeset
815 @requires_changing_parents
47611
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
816 def update_file(
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
817 self,
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
818 filename,
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
819 wc_tracked,
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
820 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
821 p2_info=False,
47611
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
822 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
823 parentfiledata=None,
47611
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
824 ):
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
825 """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
826
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
827 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
828 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
829
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
830 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
831
47771
03089463c554 dirstate: fix typo in docstring
Augie Fackler <augie@google.com>
parents: 47757
diff changeset
832 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
833 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
834 other processing.
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
835 """
50011
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
836 self._update_file(
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
837 filename=filename,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
838 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
839 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
840 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
841 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
842 parentfiledata=parentfiledata,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
843 )
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
844
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
845 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
846 """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
847
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
848 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
849 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
850 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
851
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
852 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
853 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
854 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
855 - keyword,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
856 - largefile,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
857 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
858
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
859 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
860 "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
861 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
862 to be considered.
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
863 """
50154
028fb89a0539 dirstate: enforce change context for hacky_extension_update_file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50152
diff changeset
864 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
865 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
866 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
867 self._update_file(
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
868 *args,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
869 **kwargs,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
870 )
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
871
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
872 def _update_file(
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
873 self,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
874 filename,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
875 wc_tracked,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
876 p1_tracked,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
877 p2_info=False,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
878 possibly_dirty=False,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
879 parentfiledata=None,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
880 ):
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
881 # 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
882 # 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
883 # 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
884
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
885 self._dirty = True
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
886 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
887 if old_entry is None:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
888 prev_tracked = False
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
889 else:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
890 prev_tracked = old_entry.tracked
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
891 if prev_tracked != wc_tracked:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
892 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
893
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
894 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
895 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
896 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
897 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
898 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
899 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
900 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
901 )
47611
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
902
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
903 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
904 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
905 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
906 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
907 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
908 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
909 # 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
910 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
911 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
912 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
913 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
914 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
915 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
916 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
917 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
918 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
919
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
920 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
921 """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
922 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
923 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
924 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
925 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
926 hint = _(
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
927 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
928 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
929 )
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
930 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
931
24538
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
932 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
933 if exists is None:
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
934 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
935 if not exists:
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
936 # Maybe a path component exists
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
937 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
938 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
939 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
940 folded = d + b"/" + f
24538
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
941 else:
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
942 # No path components, preserve original case
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
943 folded = path
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
944 else:
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
945 # recursively normalize leading directory components
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
946 # against dirstate
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
947 if b'/' in normed:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
948 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
949 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
950 r = self._root + b"/" + d
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
951 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
952 else:
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
953 folded = util.fspath(normed, self._root)
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
954 storemap[normed] = folded
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
955
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
956 return folded
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
957
24539
3a8eba78803e dirstate: introduce function to normalize just filenames
Siddharth Agarwal <sid0@fb.com>
parents: 24538
diff changeset
958 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
959 normed = util.normcase(path)
34676
bfddc3d678ae dirstate: remove _filefoldmap property cache
Durham Goode <durham@fb.com>
parents: 34675
diff changeset
960 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
961 if folded is None:
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
962 if isknown:
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
963 folded = path
7068
57377fa7eda2 issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
964 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
965 folded = self._discoverpath(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
966 path, normed, ignoremissing, exists, self._map.filefoldmap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
967 )
24539
3a8eba78803e dirstate: introduce function to normalize just filenames
Siddharth Agarwal <sid0@fb.com>
parents: 24538
diff changeset
968 return folded
16302
49b54f1ae053 dirstate: normalize case of directory components
Matt Mackall <mpm@selenic.com>
parents: 16258
diff changeset
969
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
970 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
971 normed = util.normcase(path)
34676
bfddc3d678ae dirstate: remove _filefoldmap property cache
Durham Goode <durham@fb.com>
parents: 34675
diff changeset
972 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
973 if folded is None:
34678
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
974 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
975 if folded is None:
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
976 if isknown:
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
977 folded = path
7068
57377fa7eda2 issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
978 else:
24540
25c1d3ca5ff6 dirstate: split the foldmap into separate ones for files and directories
Siddharth Agarwal <sid0@fb.com>
parents: 24539
diff changeset
979 # 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
980 # normalizefile calls don't start matching directories
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
981 folded = self._discoverpath(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
982 path, normed, ignoremissing, exists, self._map.dirfoldmap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
983 )
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
984 return folded
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
985
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
986 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
987 """
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
988 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
989
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
990 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
991 disk, to avoid extra filesystem access.
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
992
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
993 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
994 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
995 existing path components.
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
996
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
997 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
998
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
999 - 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
1000 - version of name stored on disk
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
1001 - version provided via command arguments
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
1002 """
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
1003
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
1004 if self._checkcase:
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
1005 return self._normalize(path, isknown, ignoremissing)
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
1006 return path
6677
9865e15febd0 Add a normalize() method to dirstate
Paul Moore <p.f.moore@gmail.com>
parents: 6675
diff changeset
1007
50114
c175b4857498 dirstate: add a comment about the semantic of `dirstate.clear`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50109
diff changeset
1008 # 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
1009 # - 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
1010 # - 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
1011 @requires_changing_parents
5065
b304c2496f52 dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4953
diff changeset
1012 def clear(self):
34933
0217f75b6e59 dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents: 34678
diff changeset
1013 self._map.clear()
5123
79373ec3f27d merge with crew-stable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5045 5065
diff changeset
1014 self._dirty = True
5065
b304c2496f52 dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4953
diff changeset
1015
50115
62f633f751a4 dirstate: mark `clear` and `rebuild` as `require_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50114
diff changeset
1016 @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
1017 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
1018 matcher = self._sparsematcher
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
1019 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
1020 # 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
1021 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
1022 if changedfiles:
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
1023 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
1024
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
1025 if changedfiles is not None:
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
1026 # 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
1027 # 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
1028 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
1029 changedfiles = dirstatefilestoremove.union(changedfiles)
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
1030
25448
2bbfc2042d93 dirstate: avoid invalidating every entries when list is empty
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25275
diff changeset
1031 if changedfiles is None:
27176
54ace3372f84 dirstate: change debugrebuilddirstate --minimal to use dirstate.rebuild
Christian Delahousse <cdelahousse@fb.com>
parents: 27016
diff changeset
1032 # Rebuild entire dirstate
43891
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1033 to_lookup = allfiles
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1034 to_drop = []
27176
54ace3372f84 dirstate: change debugrebuilddirstate --minimal to use dirstate.rebuild
Christian Delahousse <cdelahousse@fb.com>
parents: 27016
diff changeset
1035 self.clear()
43891
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1036 elif len(changedfiles) < 10:
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1037 # 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
1038 # large.
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1039 to_lookup = []
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1040 to_drop = []
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1041 for f in changedfiles:
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1042 if f in allfiles:
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1043 to_lookup.append(f)
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1044 else:
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1045 to_drop.append(f)
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1046 else:
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1047 changedfilesset = set(changedfiles)
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1048 to_lookup = changedfilesset & set(allfiles)
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1049 to_drop = changedfilesset - to_lookup
27176
54ace3372f84 dirstate: change debugrebuilddirstate --minimal to use dirstate.rebuild
Christian Delahousse <cdelahousse@fb.com>
parents: 27016
diff changeset
1050
29772
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
1051 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
1052 self._origpl = self._pl
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
1053 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
1054
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1055 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
1056 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
1057 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
1058 else:
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
1059 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
1060 f,
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
1061 wc_tracked=True,
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
1062 p1_tracked=True,
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
1063 )
43891
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
1064 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
1065 self._map.reset_state(f)
30026
ba06562a06a2 dirstate: rebuild should update dirstate properly
Mateusz Kwapich <mitrandir@fb.com>
parents: 29889
diff changeset
1066
4903
81078e177266 dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents: 4677
diff changeset
1067 self._dirty = True
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1068
50255
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1069 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
1070 """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
1071 if tr is None:
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1072 return
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1073
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1074 def on_abort(tr):
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1075 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
1076 self.invalidate()
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1077
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1078 tr.addabort(
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1079 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
1080 on_abort,
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1081 )
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1082
29673
52ff07e1de91 deprecation: enforce thew 'tr' argument of 'dirstate.write' (API)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29351
diff changeset
1083 def write(self, tr):
4612
17ee7407097f dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents: 4611
diff changeset
1084 if not self._dirty:
1794
98b6c1cad58b only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1755
diff changeset
1085 return
50121
15531d101313 dirstate: add small asserts for double security
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50120
diff changeset
1086 # 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
1087 # 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
1088 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
1089
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
1090 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
1091 if tr:
50255
fa04407bda7a dirstate: factor the transaction abort logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50254
diff changeset
1092 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
1093 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
1094
72b4d9284411 dirstate: track that changes are pending in a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50121
diff changeset
1095 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
1096 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
1097 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
1098
26634
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26633
diff changeset
1099 # delay writing in-memory changes out
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1100 tr.addfilegenerator(
50123
4e95341c89aa dirstate: distinct transaction callback from largefile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50122
diff changeset
1101 b'dirstate-1-main%s' % self._tr_key_suffix,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1102 (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
1103 on_success,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1104 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
1105 post_finalize=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1106 )
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
1107 if write_key:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
1108 tr.addfilegenerator(
50123
4e95341c89aa dirstate: distinct transaction callback from largefile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50122
diff changeset
1109 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
1110 (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
1111 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
1112 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
1113 post_finalize=True,
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
1114 )
26634
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26633
diff changeset
1115 return
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26633
diff changeset
1116
48682
cdb0d857afe2 dirstate: use a context manager when writing the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48531
diff changeset
1117 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
1118 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
1119 self._writedirstate(tr, f)
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
1120 if write_key:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
1121 # 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
1122 # 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
1123 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
1124 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
1125
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
1126 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
1127 """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
1128
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
1129 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
1130 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
1131 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
1132
29772
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
1133 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
1134 """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
1135
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
1136 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
1137 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
1138
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
1139 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
1140 with a newer callback.
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
1141 """
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
1142 self._plchangecallbacks[category] = callback
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
1143
48393
1a8a70b4b0ad dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48392
diff changeset
1144 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
1145 # 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
1146 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
1147 # 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
1148 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
1149 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
1150 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
1151 self._origpl = None
48393
1a8a70b4b0ad dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48392
diff changeset
1152 self._map.write(tr, st)
34673
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
1153 self._dirty = False
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
1154 self._dirty_tracked_set = False
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
1155
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
1156 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
1157 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
1158 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
1159
6032
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
1160 def _dirignore(self, f):
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
1161 if self._ignore(f):
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
1162 return True
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43620
diff changeset
1163 for p in pathutil.finddirs(f):
6767
80605a8127e0 dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents: 6762
diff changeset
1164 if self._ignore(p):
6032
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
1165 return True
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
1166 return False
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
1167
27594
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
1168 def _ignorefiles(self):
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
1169 files = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1170 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
1171 files.append(self._join(b'.hgignore'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1172 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
1173 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
1174 # 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
1175 # 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
1176 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
1177 return files
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
1178
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
1179 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
1180 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
1181 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
1182 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
1183 i = files.popleft()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1184 patterns = matchmod.readpatternfile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1185 i, self._ui.warn, sourceinfo=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1186 )
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
1187 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
1188 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
1189 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
1190 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
1191 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
1192 continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1193 m = matchmod.match(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1194 self._root, b'', [], [pattern], warn=self._ui.warn
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1195 )
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
1196 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
1197 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
1198 visited.add(i)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1199 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
1200
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1201 def _walkexplicit(self, match, subrepos):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
1202 """Get stat data about the files explicitly specified by match.
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
1203
19174
022256ef47b8 dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents: 19173
diff changeset
1204 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
1205 - 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
1206 listings mapping subrepos and .hg to None.
19174
022256ef47b8 dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents: 19173
diff changeset
1207 - 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
1208 - 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
1209 directories and that were not found."""
6578
f242d3684f83 walk: begin refactoring badmatch handling
Matt Mackall <mpm@selenic.com>
parents: 6577
diff changeset
1210
8681
26f133267cd7 walk: use match.bad callback for filetype messages
Matt Mackall <mpm@selenic.com>
parents: 8680
diff changeset
1211 def badtype(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1212 kind = _(b'unknown')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
1213 if stat.S_ISCHR(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1214 kind = _(b'character device')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
1215 elif stat.S_ISBLK(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1216 kind = _(b'block device')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
1217 elif stat.S_ISFIFO(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1218 kind = _(b'fifo')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
1219 elif stat.S_ISSOCK(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1220 kind = _(b'socket')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
1221 elif stat.S_ISDIR(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1222 kind = _(b'directory')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1223 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
1224
8676
acd69fc201a5 walk: we always have a badfn
Matt Mackall <mpm@selenic.com>
parents: 8675
diff changeset
1225 badfn = match.bad
6831
2b663f542bd3 dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 6830
diff changeset
1226 dmap = self._map
5000
46facb73ba8b dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents: 4965
diff changeset
1227 lstat = os.lstat
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
1228 getkind = stat.S_IFMT
6828
55d65a33da52 dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 6827
diff changeset
1229 dirkind = stat.S_IFDIR
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
1230 regkind = stat.S_IFREG
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
1231 lnkkind = stat.S_IFLNK
6831
2b663f542bd3 dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 6830
diff changeset
1232 join = self._join
19174
022256ef47b8 dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents: 19173
diff changeset
1233 dirsfound = []
022256ef47b8 dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents: 19173
diff changeset
1234 foundadd = dirsfound.append
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1235 dirsnotfound = []
19175
63f7bd2e1a46 dirstate._walkexplicit: inline dirsnotfound.append
Siddharth Agarwal <sid0@fb.com>
parents: 19174
diff changeset
1236 notfoundadd = dirsnotfound.append
6820
639d9cb95509 dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents: 6819
diff changeset
1237
24448
55c449345b10 match: add isexact() method to hide internals
Martin von Zweigbergk <martinvonz@google.com>
parents: 24212
diff changeset
1238 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
1239 normalize = self._normalize
e255a5dc29e6 dirstate: skip optimization on case-folding FS (issue2440)
Matt Mackall <mpm@selenic.com>
parents: 12401
diff changeset
1240 else:
18032
a9e623bb440e dirstate: test normalize is truthy instead of using a no-op lambda
Siddharth Agarwal <sid0@fb.com>
parents: 18018
diff changeset
1241 normalize = None
12907
e255a5dc29e6 dirstate: skip optimization on case-folding FS (issue2440)
Matt Mackall <mpm@selenic.com>
parents: 12401
diff changeset
1242
12211
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
1243 files = sorted(match.files())
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
1244 subrepos.sort()
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
1245 i, j = 0, 0
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
1246 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
1247 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
1248 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
1249 i += 1
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
1250 continue
13339
22167be007ed subrepo: fix pruning of subrepo filenames in dirstate (issue2619)
trbs <trbs@trbs.net>
parents: 13233
diff changeset
1251 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
1252 del files[i]
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
1253 j += 1
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
1254
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1255 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
1256 files = [b'']
42340
7ada598941d2 dirstate: move special handling of files==['.'] together
Martin von Zweigbergk <martinvonz@google.com>
parents: 42304
diff changeset
1257 # 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
1258 # common case where files is ['']
42340
7ada598941d2 dirstate: move special handling of files==['.'] together
Martin von Zweigbergk <martinvonz@google.com>
parents: 42304
diff changeset
1259 normalize = None
10176
24ce8f0c0a39 dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents: 10145
diff changeset
1260 results = dict.fromkeys(subrepos)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1261 results[b'.hg'] = None
5000
46facb73ba8b dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents: 4965
diff changeset
1262
12211
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
1263 for ff in files:
42340
7ada598941d2 dirstate: move special handling of files==['.'] together
Martin von Zweigbergk <martinvonz@google.com>
parents: 42304
diff changeset
1264 if normalize:
24522
18085e46caa9 dirstate._walkexplicit: drop normpath calls
Siddharth Agarwal <sid0@fb.com>
parents: 24521
diff changeset
1265 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
1266 else:
24522
18085e46caa9 dirstate._walkexplicit: drop normpath calls
Siddharth Agarwal <sid0@fb.com>
parents: 24521
diff changeset
1267 nf = ff
6829
fec1da46006e dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents: 6828
diff changeset
1268 if nf in results:
6820
639d9cb95509 dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents: 6819
diff changeset
1269 continue
639d9cb95509 dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents: 6819
diff changeset
1270
639d9cb95509 dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents: 6819
diff changeset
1271 try:
6831
2b663f542bd3 dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 6830
diff changeset
1272 st = lstat(join(nf))
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
1273 kind = getkind(st.st_mode)
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
1274 if kind == dirkind:
8588
2624f485b9bc dirstate: set more states in step 1 of walk
Simon Heimberg <simohe@besonet.ch>
parents: 8521
diff changeset
1275 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
1276 # 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
1277 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
1278 foundadd((nf, ff))
12401
4cdaf1adafc8 backout most of 4f8067c94729
Matt Mackall <mpm@selenic.com>
parents: 12387
diff changeset
1279 elif kind == regkind or kind == lnkkind:
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
1280 results[nf] = st
6828
55d65a33da52 dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 6827
diff changeset
1281 else:
8681
26f133267cd7 walk: use match.bad callback for filetype messages
Matt Mackall <mpm@selenic.com>
parents: 8680
diff changeset
1282 badfn(ff, badtype(kind))
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
1283 if nf in dmap:
6829
fec1da46006e dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents: 6828
diff changeset
1284 results[nf] = None
51699
ca7bde5dbafb black: format the codebase with 23.3.0
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51696
diff changeset
1285 except OSError as inst:
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
1286 # nf not found on disk - it is dirstate only
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1287 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
1288 results[nf] = None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1289 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
1290 if self._map.hasdir(nf):
23375
a179db3db9b9 dirstate: speed up repeated missing directory checks
Martin von Zweigbergk <martinvonz@google.com>
parents: 22915
diff changeset
1291 notfoundadd(nf)
8677
34df078b8b1b walk: simplify logic for badfn clause
Matt Mackall <mpm@selenic.com>
parents: 8676
diff changeset
1292 else:
34022
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 33981
diff changeset
1293 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
1294
36200
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
1295 # 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
1296 # 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
1297 # 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
1298 if match.anypats():
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
1299 for f in list(results):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1300 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
1301 # 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
1302 continue
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
1303 if not match(f):
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
1304 del results[f]
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
1305
25877
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
1306 # 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
1307 # 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
1308 # 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
1309 # 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
1310 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
1311 normed = {}
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
1312
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
1313 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
1314 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
1315 continue
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
1316
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
1317 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
1318 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
1319
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
1320 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
1321 paths = set()
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
1322 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
1323
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
1324 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
1325
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
1326 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
1327 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
1328 for path in paths:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1329 folded = self._discoverpath(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1330 path, norm, True, None, self._map.dirfoldmap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1331 )
25877
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
1332 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
1333 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
1334
19174
022256ef47b8 dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents: 19173
diff changeset
1335 return results, dirsfound, dirsnotfound
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1336
19190
b03952ee634d dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents: 19175
diff changeset
1337 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
1338 """
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1339 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
1340 matched by match.
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1341
19190
b03952ee634d dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents: 19175
diff changeset
1342 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
1343
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1344 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
1345 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
1346
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
1347 """
19190
b03952ee634d dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents: 19175
diff changeset
1348 # 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
1349 # 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
1350 # 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
1351
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1352 if ignored:
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1353 ignore = util.never
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1354 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
1355 elif unknown:
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
1356 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
1357 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
1358 else:
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
1359 # 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
1360 ignore = util.always
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1361 dirignore = util.always
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1362
49356
a87443d4aec0 sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
1363 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
1364 em = matchmod.exact(match.files())
a87443d4aec0 sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
1365 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
1366 match = matchmod.intersectmatchers(match, sm)
a87443d4aec0 sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
1367
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1368 matchfn = match.matchfn
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1369 matchalways = match.always()
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1370 matchtdir = match.traversedir
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1371 dmap = self._map
32208
d74b0cff94a9 osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32177
diff changeset
1372 listdir = util.listdir
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1373 lstat = os.lstat
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1374 dirkind = stat.S_IFDIR
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1375 regkind = stat.S_IFREG
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1376 lnkkind = stat.S_IFLNK
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1377 join = self._join
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1378
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1379 exact = skipstep3 = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1380 if match.isexact(): # match.exact
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1381 exact = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1382 dirignore = util.always # skip step 2
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1383 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
1384 skipstep3 = True
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1385
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1386 if not exact and self._checkcase:
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1387 normalize = self._normalize
24541
e235b5dc5cf9 dirstate.walk: use the file foldmap to normalize
Siddharth Agarwal <sid0@fb.com>
parents: 24540
diff changeset
1388 normalizefile = self._normalizefile
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1389 skipstep3 = False
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1390 else:
24560
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
1391 normalize = self._normalize
24541
e235b5dc5cf9 dirstate.walk: use the file foldmap to normalize
Siddharth Agarwal <sid0@fb.com>
parents: 24540
diff changeset
1392 normalizefile = None
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1393
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1394 # step 1: find all explicit files
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1395 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
1396 if matchtdir:
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43696
diff changeset
1397 for d in work:
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43696
diff changeset
1398 matchtdir(d[0])
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43696
diff changeset
1399 for d in dirsnotfound:
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43696
diff changeset
1400 matchtdir(d)
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
1401
19172
c6cea2e2031b dirstate.walk: pull skipstep3 out of the explicit walk code
Siddharth Agarwal <sid0@fb.com>
parents: 19171
diff changeset
1402 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
1403 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
1404
6826
eca20fee0728 dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents: 6825
diff changeset
1405 # 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
1406 def traverse(work, alreadynormed):
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1407 wadd = work.append
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1408 while work:
43239
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
1409 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
1410 nd = work.pop()
38956
a3cabe9415e1 dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents: 36995
diff changeset
1411 visitentries = match.visitchildrenset(nd)
a3cabe9415e1 dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents: 36995
diff changeset
1412 if not visitentries:
32177
8f1a2b848b52 dirstate: optimize walk() by using match.visitdir()
Martin von Zweigbergk <martinvonz@google.com>
parents: 31547
diff changeset
1413 continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1414 if visitentries == b'this' or visitentries == b'all':
38956
a3cabe9415e1 dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents: 36995
diff changeset
1415 visitentries = None
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1416 skip = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1417 if nd != b'':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1418 skip = b'.hg'
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1419 try:
43239
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
1420 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
1421 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
1422 except (PermissionError, FileNotFoundError) as inst:
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49306
diff changeset
1423 match.bad(
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49306
diff changeset
1424 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
1425 )
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49306
diff changeset
1426 continue
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1427 for f, kind, st in entries:
39260
27946fca8a05 match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents: 38959
diff changeset
1428 # 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
1429 # 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
1430 # 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
1431 # 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
1432 # 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
1433 # 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
1434 # 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
1435 # they're actually a file or a directory.
38956
a3cabe9415e1 dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents: 36995
diff changeset
1436 if visitentries and f not in visitentries:
a3cabe9415e1 dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents: 36995
diff changeset
1437 continue
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1438 if normalizefile:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1439 # 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
1440 # 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
1441 # dmap -- therefore normalizefile is enough
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1442 nf = normalizefile(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1443 nd and (nd + b"/" + f) or f, True, True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1444 )
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1445 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1446 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
1447 if nf not in results:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1448 if kind == dirkind:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1449 if not ignore(nf):
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1450 if matchtdir:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1451 matchtdir(nf)
24560
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
1452 wadd(nf)
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1453 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
1454 results[nf] = None
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1455 elif kind == regkind or kind == lnkkind:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1456 if nf in dmap:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1457 if matchalways or matchfn(nf):
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1458 results[nf] = st
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1459 elif (matchalways or matchfn(nf)) and not ignore(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1460 nf
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1461 ):
24560
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
1462 # 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
1463 if not alreadynormed:
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
1464 nf = normalize(nf, False, True)
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1465 results[nf] = st
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1466 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
1467 results[nf] = None
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
1468
24560
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
1469 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
1470 # 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
1471 # expensive directory normalization
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
1472 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
1473 traverse([d], alreadynormed)
536
c15b4bc0a11c Refactor diffrevs/diffdir into changes
mpm@selenic.com
parents: 529
diff changeset
1474
18812
1c40526da52a dirstate.walk: remove subrepo and .hg from results before step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18792
diff changeset
1475 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
1476 del results[s]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1477 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
1478
21115
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
1479 # 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
1480 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
1481 # 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
1482 # 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
1483 # 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
1484 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
1485 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
1486 else:
a18919de61e5 dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18814
diff changeset
1487 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
1488 visit.sort()
a18919de61e5 dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18814
diff changeset
1489
18625
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
1490 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
1491 # 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
1492 # 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
1493 # 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
1494 # 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
1495 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
1496
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
1497 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
1498 # 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
1499 # 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
1500 # 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
1501 # on disk.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1502 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1503 normalizefile
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1504 and normalizefile(nf, True, True) in results
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1505 ):
24621
1784ca148392 dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents: 24537
diff changeset
1506 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
1507 # 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
1508 # 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
1509 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
1510 try:
05cf40f9b0ec dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents: 18653
diff changeset
1511 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
1512 # 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
1513 except OSError:
05cf40f9b0ec dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents: 18653
diff changeset
1514 # file doesn't exist
05cf40f9b0ec dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents: 18653
diff changeset
1515 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
1516 else:
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
1517 # 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
1518 # 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
1519 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
1520 else:
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
1521 # 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
1522 # 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
1523 iv = iter(visit)
26984
af2663680e95 dirstate: back out 502b56a9e897
Bryan O'Sullivan <bos@serpentine.com>
parents: 26887
diff changeset
1524 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
1525 results[next(iv)] = st
6829
fec1da46006e dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents: 6828
diff changeset
1526 return results
669
8aa2a282eda4 .hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents: 667
diff changeset
1527
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1528 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
1529 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
1530 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
1531 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
1532 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
1533 # 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
1534 # 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
1535 # 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
1536 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
1537 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
1538 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
1539
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
1540 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
1541 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
1542 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
1543
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
1544 (
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
1545 lookup,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
1546 modified,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
1547 added,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
1548 removed,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
1549 deleted,
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1550 clean,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1551 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
1552 unknown,
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1553 warnings,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1554 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
1555 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
1556 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
1557 ) = rustmod.status(
48121
5fc2dfb073d6 dirstatemap: rename `_rustmap` to `_map`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48107
diff changeset
1558 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
1559 matcher,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
1560 self._rootdir,
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1561 self._ignorefiles(),
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1562 self._checkexec,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1563 bool(list_clean),
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1564 bool(list_ignored),
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1565 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
1566 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
1567 )
44840
4ba2a6ffcf24 status: also support for `traversedir` callback in the Rust fast-path
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44836
diff changeset
1568
47350
04d1f17f49e7 dirstate-v2: Write .hg/dirstate back to disk on directory cache changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47320
diff changeset
1569 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
1570
44840
4ba2a6ffcf24 status: also support for `traversedir` callback in the Rust fast-path
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44836
diff changeset
1571 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
1572 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
1573 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
1574
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1575 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
1576 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
1577 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
1578 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
1579 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
1580 file_path,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1581 syntax,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1582 )
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1583 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
1584 else:
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1585 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
1586 self._ui.warn(
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1587 msg
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1588 % (
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1589 pathutil.canonpath(
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1590 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
1591 ),
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1592 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
1593 )
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1594 )
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1595
51626
eb11153c1698 rust-status: sort the failed matches when printing them
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51270
diff changeset
1596 for fn, message in sorted(bad):
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1597 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
1598
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
1599 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
1600 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
1601 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
1602 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
1603 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
1604 unknown=unknown,
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1605 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
1606 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
1607 )
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
1608 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
1609
10176
24ce8f0c0a39 dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents: 10145
diff changeset
1610 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
1611 """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
1612 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
1613 scmutil.status and:
9518
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
1614
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
1615 unsure:
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
1616 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
1617 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
1618 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
1619 status.modified:
9518
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
1620 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
1621 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
1622 status.clean:
9518
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
1623 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
1624 dirstate was written
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
1625 """
50149
03decaaf1eff dirstate: enforce `running_status` context for calling `status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50148
diff changeset
1626 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
1627 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
1628 raise error.ProgrammingError(msg)
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6750
diff changeset
1629 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
1630 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
1631 removed, deleted, clean = [], [], []
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
1632
5003
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
1633 dmap = self._map
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
1634 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
1635
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
1636 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
1637
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 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
1639 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
1640 elif self._checkcase:
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1641 # 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
1642 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
1643 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
1644 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
1645
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
1646 # 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
1647 # 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
1648 try:
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
1649 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
1650 except OSError:
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
1651 # 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
1652 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
1653
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
1654 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
1655 try:
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
1656 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
1657 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
1658 )
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
1659 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
1660 except rustmod.FallbackError:
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1661 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
1662
43620
dd773340a085 dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43612
diff changeset
1663 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
1664 pass
dd773340a085 dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43612
diff changeset
1665
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
1666 dcontains = dmap.__contains__
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
1667 dget = dmap.__getitem__
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1668 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
1669 madd = modified.append
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
1670 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
1671 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
1672 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
1673 radd = removed.append
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
1674 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
1675 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
1676 mexact = match.exact
1a570f04de07 dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents: 18032
diff changeset
1677 dirignore = self._dirignore
1a570f04de07 dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents: 18032
diff changeset
1678 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
1679 checklink = self._checklink
34336
0865d25e8a8a dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34335
diff changeset
1680 copymap = self._map.copymap
5003
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
1681
19191
ab9de1e8fc36 dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents: 19190
diff changeset
1682 # 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
1683 # - we're listing all clean files, or
ab9de1e8fc36 dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents: 19190
diff changeset
1684 # - 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
1685 # 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
1686 full = listclean or match.traversedir is not None
48922
fe056166b40d dirstate: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
1687 for fn, st in self.walk(
fe056166b40d dirstate: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
1688 match, subrepos, listunknown, listignored, full=full
fe056166b40d dirstate: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
1689 ).items():
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
1690 if not dcontains(fn):
18034
1a570f04de07 dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents: 18032
diff changeset
1691 if (listignored or mexact(fn)) and dirignore(fn):
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6750
diff changeset
1692 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
1693 iadd(fn)
19910
601944f41257 dirstate.status: return explicit unknown files even when not asked
Siddharth Agarwal <sid0@fb.com>
parents: 19651
diff changeset
1694 else:
5003
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
1695 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
1696 continue
6591
eda3fd322a7f dirstate: minor status cleanups
Matt Mackall <mpm@selenic.com>
parents: 6590
diff changeset
1697
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
1698 t = dget(fn)
47536
8e4b9fe31334 dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47535
diff changeset
1699 mode = t.mode
47537
0e5800c88eb4 dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47536
diff changeset
1700 size = t.size
6591
eda3fd322a7f dirstate: minor status cleanups
Matt Mackall <mpm@selenic.com>
parents: 6590
diff changeset
1701
47531
f5b8f0b9c129 dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
1702 if not st and t.tracked:
6818
6e93fbd847ef dirstate.walk: eliminate src from yield
Matt Mackall <mpm@selenic.com>
parents: 6811
diff changeset
1703 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
1704 elif t.p2_info:
47533
174d0bcce2eb dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
1705 madd(fn)
174d0bcce2eb dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
1706 elif t.added:
174d0bcce2eb dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
1707 aadd(fn)
174d0bcce2eb dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
1708 elif t.removed:
174d0bcce2eb dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
1709 radd(fn)
47534
e53a42dce923 dirstate: drop last explicite `state` usage in status
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47533
diff changeset
1710 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
1711 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
1712 # 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
1713 # 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
1714 # 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
1715 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
1716 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
1717 # 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
1718 # 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
1719 # 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
1720 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
1721 elif (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1722 size >= 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1723 and (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1724 (size != st.st_size and size != st.st_size & _rangemask)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1725 or ((mode ^ st.st_mode) & 0o100 and checkexec)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1726 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1727 or fn in copymap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1728 ):
46703
ca69e29a2a30 formatting: fix redundant parentheses
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46678
diff changeset
1729 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
1730 # 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
1731 # 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
1732 ladd(fn)
0d055849d5f9 enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents: 45942
diff changeset
1733 else:
0d055849d5f9 enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents: 45942
diff changeset
1734 madd(fn)
48260
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48252
diff changeset
1735 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
1736 # 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
1737 # 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
1738 # 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
1739 # 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
1740 ladd(fn)
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6750
diff changeset
1741 elif listclean:
5003
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
1742 cadd(fn)
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1743 status = scmutil.status(
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
1744 modified, added, removed, deleted, unknown, ignored, clean
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
1745 )
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
1746 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
1747
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
1748 def matches(self, match):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
1749 """
21984
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
1750 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
1751 """
21984
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
1752 dmap = self._map
44357
bed8d08cfcb2 rust-dirstatemap: remove additional lookup in dirstate.matches
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44297
diff changeset
1753 if rustmod is not None:
48121
5fc2dfb073d6 dirstatemap: rename `_rustmap` to `_map`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48107
diff changeset
1754 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
1755
21984
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
1756 if match.always():
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
1757 return dmap.keys()
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
1758 files = match.files()
24448
55c449345b10 match: add isexact() method to hide internals
Martin von Zweigbergk <martinvonz@google.com>
parents: 24212
diff changeset
1759 if match.isexact():
21984
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
1760 # 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
1761 # much smaller than dmap
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
1762 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
1763 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
1764 # 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
1765 # that
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
1766 return list(files)
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
1767 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
1768
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
1769 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
1770 """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
1771
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
1772 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
1773 """
50267
f92afdf3cff9 transaction: remove the `branch` backup for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50266
diff changeset
1774 files = [b'branch']
f92afdf3cff9 transaction: remove the `branch` backup for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50266
diff changeset
1775 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
1776 files.append(self._filename)
f92afdf3cff9 transaction: remove the `branch` backup for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50266
diff changeset
1777 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
1778 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
1779 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
1780
49827
d09a57ce6fc4 verify: print short `p1` node in relevant dirstate messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49824
diff changeset
1781 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
1782 """
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 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
1784 """
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 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
1786 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
1787 )
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 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
1789 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
1790 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
1791 )
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
1792 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
1793 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
1794 )
48089
c87844960a35 dirstate: move verification code within the dirstate itself
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48085
diff changeset
1795 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
1796 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
1797 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
1798 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
1799 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
1800 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
1801 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
1802 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
1803 for f in m1:
49822
1d8721be2428 dirstate: add narrow support to `verify`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49821
diff changeset
1804 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
1805 continue
49821
8f200511cdc7 dirstate: stop using `entry.state()` for logic in `verify`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49479
diff changeset
1806 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
1807 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
1808 yield missing_from_ds % (f, node.short(p1))