Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/narrowspec.py @ 50226:f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
This make it more transactional and will help us to simplify their backup.
The implementation is not great, but it keep the patch simple as this is not the
time for a larger refactoring yet.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 23 Feb 2023 03:25:44 +0100 |
parents | 8bc14ac53a41 |
children | 39256bee2ed9 |
rev | line source |
---|---|
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
1 # narrowspec.py - methods for working with a narrow view of a repository |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
2 # |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
3 # Copyright 2017 Google, Inc. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
4 # |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 |
50225
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
8 import weakref |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
9 |
36198
9fd8c2a3db5a
narrowspec: move module into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36197
diff
changeset
|
10 from .i18n import _ |
43089
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
11 from .pycompat import getattr |
36198
9fd8c2a3db5a
narrowspec: move module into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36197
diff
changeset
|
12 from . import ( |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 error, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 match as matchmod, |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
15 merge, |
44915
b7808443ed6a
mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents:
44572
diff
changeset
|
16 mergestate as mergestatemod, |
45392
77b8588dd84e
requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45355
diff
changeset
|
17 requirements, |
42192
770f5f586ae5
narrow: make warning about possibly dirty files respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents:
41687
diff
changeset
|
18 scmutil, |
38878
f64ebe7d2259
narrowspec: use sparse.parseconfig() to parse narrowspec file (BC)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38875
diff
changeset
|
19 sparse, |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
20 util, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
21 ) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
22 |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
23 # The file in .hg/store/ that indicates which paths exit in the store |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
24 FILENAME = b'narrowspec' |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
25 # The file in .hg/ that indicates which paths exit in the dirstate |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
26 DIRSTATE_FILENAME = b'narrowspec.dirstate' |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
27 |
39548
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
28 # Pattern prefixes that are allowed in narrow patterns. This list MUST |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
29 # only contain patterns that are fast and safe to evaluate. Keep in mind |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
30 # that patterns are supplied by clients and executed on remote servers |
39816
ae20f52437e9
wireprotov2: advertise recognized path filter prefixes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39572
diff
changeset
|
31 # as part of wire protocol commands. That means that changes to this |
ae20f52437e9
wireprotov2: advertise recognized path filter prefixes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39572
diff
changeset
|
32 # data structure influence the wire protocol and should not be taken |
ae20f52437e9
wireprotov2: advertise recognized path filter prefixes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39572
diff
changeset
|
33 # lightly - especially removals. |
39548
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
34 VALID_PREFIXES = ( |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
35 b'path:', |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
36 b'rootfilesin:', |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
37 ) |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
38 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
39 |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
40 def normalizesplitpattern(kind, pat): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
41 """Returns the normalized version of a pattern and kind. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
42 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
43 Returns a tuple with the normalized kind and normalized pattern. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
44 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
45 pat = pat.rstrip(b'/') |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
46 _validatepattern(pat) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
47 return kind, pat |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
48 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
49 |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
50 def _numlines(s): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
51 """Returns the number of lines in s, including ending empty lines.""" |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
52 # We use splitlines because it is Unicode-friendly and thus Python 3 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
53 # compatible. However, it does not count empty lines at the end, so trick |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
54 # it by adding a character at the end. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
55 return len((s + b'x').splitlines()) |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
56 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
57 |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
58 def _validatepattern(pat): |
36136
9c55bbc29dcf
narrowspec: document constraints when validating patterns
Augie Fackler <augie@google.com>
parents:
36117
diff
changeset
|
59 """Validates the pattern and aborts if it is invalid. |
9c55bbc29dcf
narrowspec: document constraints when validating patterns
Augie Fackler <augie@google.com>
parents:
36117
diff
changeset
|
60 |
9c55bbc29dcf
narrowspec: document constraints when validating patterns
Augie Fackler <augie@google.com>
parents:
36117
diff
changeset
|
61 Patterns are stored in the narrowspec as newline-separated |
9c55bbc29dcf
narrowspec: document constraints when validating patterns
Augie Fackler <augie@google.com>
parents:
36117
diff
changeset
|
62 POSIX-style bytestring paths. There's no escaping. |
9c55bbc29dcf
narrowspec: document constraints when validating patterns
Augie Fackler <augie@google.com>
parents:
36117
diff
changeset
|
63 """ |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
64 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
65 # We use newlines as separators in the narrowspec file, so don't allow them |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
66 # in patterns. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
67 if _numlines(pat) > 1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
68 raise error.Abort(_(b'newlines are not allowed in narrowspec paths')) |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
69 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
70 components = pat.split(b'/') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
71 if b'.' in components or b'..' in components: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
72 raise error.Abort( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
73 _(b'"." and ".." are not allowed in narrowspec paths') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
74 ) |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
75 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
76 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
77 def normalizepattern(pattern, defaultkind=b'path'): |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
78 """Returns the normalized version of a text-format pattern. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
79 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
80 If the pattern has no kind, the default will be added. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
81 """ |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
82 kind, pat = matchmod._patsplit(pattern, defaultkind) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
83 return b'%s:%s' % normalizesplitpattern(kind, pat) |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
84 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
85 |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
86 def parsepatterns(pats): |
39548
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
87 """Parses an iterable of patterns into a typed pattern set. |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
88 |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
89 Patterns are assumed to be ``path:`` if no prefix is present. |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
90 For safety and performance reasons, only some prefixes are allowed. |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
91 See ``validatepatterns()``. |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
92 |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
93 This function should be used on patterns that come from the user to |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
94 normalize and validate them to the internal data structure used for |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
95 representing patterns. |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
96 """ |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
97 res = {normalizepattern(orig) for orig in pats} |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
98 validatepatterns(res) |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
99 return res |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
100 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
101 |
39548
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
102 def validatepatterns(pats): |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
103 """Validate that patterns are in the expected data structure and format. |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
104 |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
105 And that is a set of normalized patterns beginning with ``path:`` or |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
106 ``rootfilesin:``. |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
107 |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
108 This function should be used to validate internal data structures |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
109 and patterns that are loaded from sources that use the internal, |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
110 prefixed pattern representation (but can't necessarily be fully trusted). |
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
111 """ |
48777
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
112 with util.timedcm('narrowspec.validatepatterns(pats size=%d)', len(pats)): |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
113 if not isinstance(pats, set): |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
114 raise error.ProgrammingError( |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
115 b'narrow patterns should be a set; got %r' % pats |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
116 ) |
39548
0d572769046a
narrowspec: limit patterns to path: and rootfilesin: (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39542
diff
changeset
|
117 |
48777
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
118 for pat in pats: |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
119 if not pat.startswith(VALID_PREFIXES): |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
120 # Use a Mercurial exception because this can happen due to user |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
121 # bugs (e.g. manually updating spec file). |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
122 raise error.Abort( |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
123 _(b'invalid prefix on narrow pattern: %s') % pat, |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
124 hint=_( |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
125 b'narrow patterns must begin with one of ' |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
126 b'the following: %s' |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
127 ) |
eb9c55453249
narrowspec: add timing block for validating narrowspec
Augie Fackler <augie@google.com>
parents:
48438
diff
changeset
|
128 % b', '.join(VALID_PREFIXES), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
129 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
130 |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
131 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
132 def format(includes, excludes): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
133 output = b'[include]\n' |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
134 for i in sorted(includes - excludes): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
135 output += i + b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
136 output += b'[exclude]\n' |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
137 for e in sorted(excludes): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
138 output += e + b'\n' |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
139 return output |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
140 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
141 |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
142 def match(root, include=None, exclude=None): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
143 if not include: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
144 # Passing empty include and empty exclude to matchmod.match() |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
145 # gives a matcher that matches everything, so explicitly use |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
146 # the nevermatcher. |
41687
0531dff73d0b
match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
41298
diff
changeset
|
147 return matchmod.never() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
148 return matchmod.match( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
149 root, b'', [], include=include or [], exclude=exclude or [] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
150 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
151 |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
152 |
40729
efd0f79246e3
narrow: extract helper for parsing narrowspec file
Martin von Zweigbergk <martinvonz@google.com>
parents:
39816
diff
changeset
|
153 def parseconfig(ui, spec): |
efd0f79246e3
narrow: extract helper for parsing narrowspec file
Martin von Zweigbergk <martinvonz@google.com>
parents:
39816
diff
changeset
|
154 # maybe we should care about the profiles returned too |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
155 includepats, excludepats, profiles = sparse.parseconfig(ui, spec, b'narrow') |
40729
efd0f79246e3
narrow: extract helper for parsing narrowspec file
Martin von Zweigbergk <martinvonz@google.com>
parents:
39816
diff
changeset
|
156 if profiles: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
157 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
158 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
159 b"including other spec files using '%include' is not" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
160 b" supported in narrowspec" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
161 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
162 ) |
40729
efd0f79246e3
narrow: extract helper for parsing narrowspec file
Martin von Zweigbergk <martinvonz@google.com>
parents:
39816
diff
changeset
|
163 |
efd0f79246e3
narrow: extract helper for parsing narrowspec file
Martin von Zweigbergk <martinvonz@google.com>
parents:
39816
diff
changeset
|
164 validatepatterns(includepats) |
efd0f79246e3
narrow: extract helper for parsing narrowspec file
Martin von Zweigbergk <martinvonz@google.com>
parents:
39816
diff
changeset
|
165 validatepatterns(excludepats) |
efd0f79246e3
narrow: extract helper for parsing narrowspec file
Martin von Zweigbergk <martinvonz@google.com>
parents:
39816
diff
changeset
|
166 |
efd0f79246e3
narrow: extract helper for parsing narrowspec file
Martin von Zweigbergk <martinvonz@google.com>
parents:
39816
diff
changeset
|
167 return includepats, excludepats |
efd0f79246e3
narrow: extract helper for parsing narrowspec file
Martin von Zweigbergk <martinvonz@google.com>
parents:
39816
diff
changeset
|
168 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
169 |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
170 def load(repo): |
42423
0c0a22f5b0b5
narrowspec: use vfs.tryread() instead of reimplementing
Martin von Zweigbergk <martinvonz@google.com>
parents:
42213
diff
changeset
|
171 # Treat "narrowspec does not exist" the same as "narrowspec file exists |
0c0a22f5b0b5
narrowspec: use vfs.tryread() instead of reimplementing
Martin von Zweigbergk <martinvonz@google.com>
parents:
42213
diff
changeset
|
172 # and is empty". |
0c0a22f5b0b5
narrowspec: use vfs.tryread() instead of reimplementing
Martin von Zweigbergk <martinvonz@google.com>
parents:
42213
diff
changeset
|
173 spec = repo.svfs.tryread(FILENAME) |
40729
efd0f79246e3
narrow: extract helper for parsing narrowspec file
Martin von Zweigbergk <martinvonz@google.com>
parents:
39816
diff
changeset
|
174 return parseconfig(repo.ui, spec) |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
175 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
176 |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
177 def save(repo, includepats, excludepats): |
50225
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
178 repo = repo.unfiltered() |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
179 |
39556
8d8e61df8259
narrowspec: validate patterns when loading and saving spec file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
180 validatepatterns(includepats) |
8d8e61df8259
narrowspec: validate patterns when loading and saving spec file
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
181 validatepatterns(excludepats) |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
182 spec = format(includepats, excludepats) |
50225
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
183 |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
184 tr = repo.currenttransaction() |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
185 if tr is None: |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
186 repo.svfs.write(FILENAME, spec) |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
187 else: |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
188 # the roundtrip is sometime different |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
189 # not taking any chance for now |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
190 value = parseconfig(repo.ui, spec) |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
191 reporef = weakref.ref(repo) |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
192 |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
193 def clean_pending(tr): |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
194 r = reporef() |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
195 if r is not None: |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
196 r._pending_narrow_pats = None |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
197 |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
198 tr.addpostclose(b'narrow-spec', clean_pending) |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
199 tr.addabort(b'narrow-spec', clean_pending) |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
200 repo._pending_narrow_pats = value |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
201 |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
202 def write_spec(f): |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
203 f.write(spec) |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
204 |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
205 tr.addfilegenerator( |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
206 # XXX think about order at some point |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
207 b"narrow-spec", |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
208 (FILENAME,), |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
209 write_spec, |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
210 location=b'store', |
8bc14ac53a41
narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50224
diff
changeset
|
211 ) |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
212 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
213 |
41229
50ca531f1f24
narrow: copy store narrowspec to working copy immediately
Martin von Zweigbergk <martinvonz@google.com>
parents:
41227
diff
changeset
|
214 def copytoworkingcopy(repo): |
50226
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
215 repo = repo.unfiltered() |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
216 tr = repo.currenttransaction() |
50224
99296ca9f29e
narrow: get the narrow patterns from the repository object instead of disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50184
diff
changeset
|
217 spec = format(*repo.narrowpats) |
50226
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
218 if tr is None: |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
219 repo.vfs.write(DIRSTATE_FILENAME, spec) |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
220 else: |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
221 |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
222 reporef = weakref.ref(repo) |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
223 |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
224 def clean_pending(tr): |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
225 r = reporef() |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
226 if r is not None: |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
227 r._pending_narrow_pats_dirstate = None |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
228 |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
229 tr.addpostclose(b'narrow-spec-dirstate', clean_pending) |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
230 tr.addabort(b'narrow-spec-dirstate', clean_pending) |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
231 repo._pending_narrow_pats_dirstate = repo.narrowpats |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
232 |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
233 def write_spec(f): |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
234 f.write(spec) |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
235 |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
236 tr.addfilegenerator( |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
237 # XXX think about order at some point |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
238 b"narrow-spec-dirstate", |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
239 (DIRSTATE_FILENAME,), |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
240 write_spec, |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
241 location=b'plain', |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
242 ) |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
243 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
244 |
38908
ad24b581e4d9
narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents:
38879
diff
changeset
|
245 def savebackup(repo, backupname): |
45392
77b8588dd84e
requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45355
diff
changeset
|
246 if requirements.NARROW_REQUIREMENT not in repo.requirements: |
38908
ad24b581e4d9
narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents:
38879
diff
changeset
|
247 return |
41044
1e8d9f472ea1
narrow: keep narrowspec backup in store
Martin von Zweigbergk <martinvonz@google.com>
parents:
40729
diff
changeset
|
248 svfs = repo.svfs |
1e8d9f472ea1
narrow: keep narrowspec backup in store
Martin von Zweigbergk <martinvonz@google.com>
parents:
40729
diff
changeset
|
249 svfs.tryunlink(backupname) |
1e8d9f472ea1
narrow: keep narrowspec backup in store
Martin von Zweigbergk <martinvonz@google.com>
parents:
40729
diff
changeset
|
250 util.copyfile(svfs.join(FILENAME), svfs.join(backupname), hardlink=True) |
38875
fed6fe856333
narrow: extract part of narrowspec backup to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
36500
diff
changeset
|
251 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
252 |
38908
ad24b581e4d9
narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents:
38879
diff
changeset
|
253 def restorebackup(repo, backupname): |
45392
77b8588dd84e
requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45355
diff
changeset
|
254 if requirements.NARROW_REQUIREMENT not in repo.requirements: |
38908
ad24b581e4d9
narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents:
38879
diff
changeset
|
255 return |
41044
1e8d9f472ea1
narrow: keep narrowspec backup in store
Martin von Zweigbergk <martinvonz@google.com>
parents:
40729
diff
changeset
|
256 util.rename(repo.svfs.join(backupname), repo.svfs.join(FILENAME)) |
38875
fed6fe856333
narrow: extract part of narrowspec backup to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
36500
diff
changeset
|
257 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
258 |
41227
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
259 def savewcbackup(repo, backupname): |
45392
77b8588dd84e
requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45355
diff
changeset
|
260 if requirements.NARROW_REQUIREMENT not in repo.requirements: |
38908
ad24b581e4d9
narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents:
38879
diff
changeset
|
261 return |
41227
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
262 vfs = repo.vfs |
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
263 vfs.tryunlink(backupname) |
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
264 # It may not exist in old repos |
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
265 if vfs.exists(DIRSTATE_FILENAME): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
266 util.copyfile( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
267 vfs.join(DIRSTATE_FILENAME), vfs.join(backupname), hardlink=True |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
268 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
269 |
41227
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
270 |
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
271 def restorewcbackup(repo, backupname): |
45392
77b8588dd84e
requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45355
diff
changeset
|
272 if requirements.NARROW_REQUIREMENT not in repo.requirements: |
41227
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
273 return |
41298
88a7c211b21e
narrow: fix crash when restoring backup in legacy repo
Martin von Zweigbergk <martinvonz@google.com>
parents:
41238
diff
changeset
|
274 # It may not exist in old repos |
88a7c211b21e
narrow: fix crash when restoring backup in legacy repo
Martin von Zweigbergk <martinvonz@google.com>
parents:
41238
diff
changeset
|
275 if repo.vfs.exists(backupname): |
88a7c211b21e
narrow: fix crash when restoring backup in legacy repo
Martin von Zweigbergk <martinvonz@google.com>
parents:
41238
diff
changeset
|
276 util.rename(repo.vfs.join(backupname), repo.vfs.join(DIRSTATE_FILENAME)) |
41227
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
277 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
278 |
41227
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
279 def clearwcbackup(repo, backupname): |
45392
77b8588dd84e
requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents:
45355
diff
changeset
|
280 if requirements.NARROW_REQUIREMENT not in repo.requirements: |
41227
b74481038438
narrow: make dirstateguard back up and restore working copy narrowspec instead
Martin von Zweigbergk <martinvonz@google.com>
parents:
41177
diff
changeset
|
281 return |
41298
88a7c211b21e
narrow: fix crash when restoring backup in legacy repo
Martin von Zweigbergk <martinvonz@google.com>
parents:
41238
diff
changeset
|
282 repo.vfs.tryunlink(backupname) |
38875
fed6fe856333
narrow: extract part of narrowspec backup to core
Martin von Zweigbergk <martinvonz@google.com>
parents:
36500
diff
changeset
|
283 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
284 |
36138
8fd0a9e2d7e9
narrow: make restrictpatterns a little more idiomatic
Augie Fackler <augie@google.com>
parents:
36137
diff
changeset
|
285 def restrictpatterns(req_includes, req_excludes, repo_includes, repo_excludes): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45392
diff
changeset
|
286 r"""Restricts the patterns according to repo settings, |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
287 results in a logical AND operation |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
288 |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
289 :param req_includes: requested includes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
290 :param req_excludes: requested excludes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
291 :param repo_includes: repo includes |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
292 :param repo_excludes: repo excludes |
36138
8fd0a9e2d7e9
narrow: make restrictpatterns a little more idiomatic
Augie Fackler <augie@google.com>
parents:
36137
diff
changeset
|
293 :return: include patterns, exclude patterns, and invalid include patterns. |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
294 """ |
36137
b8bbe589fd47
narrowspec: consistently use set() to copy sets
Augie Fackler <augie@google.com>
parents:
36136
diff
changeset
|
295 res_excludes = set(req_excludes) |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
296 res_excludes.update(repo_excludes) |
36138
8fd0a9e2d7e9
narrow: make restrictpatterns a little more idiomatic
Augie Fackler <augie@google.com>
parents:
36137
diff
changeset
|
297 invalid_includes = [] |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
298 if not req_includes: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
299 res_includes = set(repo_includes) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
300 elif b'path:.' not in repo_includes: |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
301 res_includes = [] |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
302 for req_include in req_includes: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
303 req_include = util.expandpath(util.normpath(req_include)) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
304 if req_include in repo_includes: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
305 res_includes.append(req_include) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
306 continue |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
307 valid = False |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
308 for repo_include in repo_includes: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
309 if req_include.startswith(repo_include + b'/'): |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
310 valid = True |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
311 res_includes.append(req_include) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
312 break |
36138
8fd0a9e2d7e9
narrow: make restrictpatterns a little more idiomatic
Augie Fackler <augie@google.com>
parents:
36137
diff
changeset
|
313 if not valid: |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
314 invalid_includes.append(req_include) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
315 if len(res_includes) == 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
316 res_excludes = {b'path:.'} |
36117
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
317 else: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
318 res_includes = set(res_includes) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
319 else: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
320 res_includes = set(req_includes) |
36138
8fd0a9e2d7e9
narrow: make restrictpatterns a little more idiomatic
Augie Fackler <augie@google.com>
parents:
36137
diff
changeset
|
321 return res_includes, res_excludes, invalid_includes |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
322 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
323 |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
324 # These two are extracted for extensions (specifically for Google's CitC file |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
325 # system) |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
326 def _deletecleanfiles(repo, files): |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
327 for f in files: |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
328 repo.wvfs.unlinkpath(f) |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
329 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
330 |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
331 def _writeaddedfiles(repo, pctx, files): |
45355
b9b055f15035
merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44915
diff
changeset
|
332 mresult = merge.mergeresult() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
333 mf = repo[b'.'].manifest() |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
334 for f in files: |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
335 if not repo.wvfs.exists(f): |
45355
b9b055f15035
merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44915
diff
changeset
|
336 mresult.addfile( |
b9b055f15035
merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44915
diff
changeset
|
337 f, |
b9b055f15035
merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44915
diff
changeset
|
338 mergestatemod.ACTION_GET, |
b9b055f15035
merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44915
diff
changeset
|
339 (mf.flags(f), False), |
b9b055f15035
merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44915
diff
changeset
|
340 b"narrowspec updated", |
b9b055f15035
merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44915
diff
changeset
|
341 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
342 merge.applyupdates( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
343 repo, |
45355
b9b055f15035
merge: pass mergeresult obj instead of actions in applyupdates() (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44915
diff
changeset
|
344 mresult, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
345 wctx=repo[None], |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
346 mctx=repo[b'.'], |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
347 overwrite=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
348 wantfiledata=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
349 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
350 |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
351 |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
352 def checkworkingcopynarrowspec(repo): |
42430
4738c292a520
narrowspec: replace one recursion-avoidance hack with another
Martin von Zweigbergk <martinvonz@google.com>
parents:
42423
diff
changeset
|
353 # Avoid infinite recursion when updating the working copy |
4738c292a520
narrowspec: replace one recursion-avoidance hack with another
Martin von Zweigbergk <martinvonz@google.com>
parents:
42423
diff
changeset
|
354 if getattr(repo, '_updatingnarrowspec', False): |
4738c292a520
narrowspec: replace one recursion-avoidance hack with another
Martin von Zweigbergk <martinvonz@google.com>
parents:
42423
diff
changeset
|
355 return |
50224
99296ca9f29e
narrow: get the narrow patterns from the repository object instead of disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50184
diff
changeset
|
356 storespec = repo.narrowpats |
50226
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
357 wcspec = repo._pending_narrow_pats_dirstate |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
358 if wcspec is None: |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
359 oldspec = repo.vfs.tryread(DIRSTATE_FILENAME) |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
360 wcspec = parseconfig(repo.ui, oldspec) |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
361 if wcspec != storespec: |
48242
7ed0fc687220
narrow: raise StateError when working copy is stale (for detailed exit code)
Martin von Zweigbergk <martinvonz@google.com>
parents:
47752
diff
changeset
|
362 raise error.StateError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
363 _(b"working copy's narrowspec is stale"), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
364 hint=_(b"run 'hg tracked --update-working-copy'"), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
365 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42823
diff
changeset
|
366 |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
367 |
41238
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
368 def updateworkingcopy(repo, assumeclean=False): |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
369 """updates the working copy and dirstate from the store narrowspec |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
370 |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
371 When assumeclean=True, files that are not known to be clean will also |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
372 be deleted. It is then up to the caller to make sure they are clean. |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
373 """ |
50226
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
374 old = repo._pending_narrow_pats_dirstate |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
375 if old is None: |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
376 oldspec = repo.vfs.tryread(DIRSTATE_FILENAME) |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
377 oldincludes, oldexcludes = parseconfig(repo.ui, oldspec) |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
378 else: |
f18e4608bb61
narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50225
diff
changeset
|
379 oldincludes, oldexcludes = old |
50224
99296ca9f29e
narrow: get the narrow patterns from the repository object instead of disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50184
diff
changeset
|
380 newincludes, newexcludes = repo.narrowpats |
42430
4738c292a520
narrowspec: replace one recursion-avoidance hack with another
Martin von Zweigbergk <martinvonz@google.com>
parents:
42423
diff
changeset
|
381 repo._updatingnarrowspec = True |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
382 |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
383 oldmatch = match(repo.root, include=oldincludes, exclude=oldexcludes) |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
384 newmatch = match(repo.root, include=newincludes, exclude=newexcludes) |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
385 addedmatch = matchmod.differencematcher(newmatch, oldmatch) |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
386 removedmatch = matchmod.differencematcher(oldmatch, newmatch) |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
387 |
50184
31be0b46fd47
narrow: use `running_status` in `updateworkingcopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48966
diff
changeset
|
388 assert repo.currentwlock() is not None |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
389 ds = repo.dirstate |
50184
31be0b46fd47
narrow: use `running_status` in `updateworkingcopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48966
diff
changeset
|
390 with ds.running_status(repo): |
31be0b46fd47
narrow: use `running_status` in `updateworkingcopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48966
diff
changeset
|
391 lookup, status, _mtime_boundary = ds.status( |
31be0b46fd47
narrow: use `running_status` in `updateworkingcopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48966
diff
changeset
|
392 removedmatch, |
31be0b46fd47
narrow: use `running_status` in `updateworkingcopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48966
diff
changeset
|
393 subrepos=[], |
31be0b46fd47
narrow: use `running_status` in `updateworkingcopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48966
diff
changeset
|
394 ignored=True, |
31be0b46fd47
narrow: use `running_status` in `updateworkingcopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48966
diff
changeset
|
395 clean=True, |
31be0b46fd47
narrow: use `running_status` in `updateworkingcopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48966
diff
changeset
|
396 unknown=True, |
31be0b46fd47
narrow: use `running_status` in `updateworkingcopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48966
diff
changeset
|
397 ) |
41238
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
398 trackeddirty = status.modified + status.added |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
399 clean = status.clean |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
400 if assumeclean: |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
401 clean.extend(lookup) |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
402 else: |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
403 trackeddirty.extend(lookup) |
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
404 _deletecleanfiles(repo, clean) |
42192
770f5f586ae5
narrow: make warning about possibly dirty files respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents:
41687
diff
changeset
|
405 uipathfn = scmutil.getuipathfn(repo) |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
406 for f in sorted(trackeddirty): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
407 repo.ui.status( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
408 _(b'not deleting possibly dirty file %s\n') % uipathfn(f) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
409 ) |
42213
84bd6ae2d1f6
narrow: also warn when not deleting untracked or ignored files
Martin von Zweigbergk <martinvonz@google.com>
parents:
42192
diff
changeset
|
410 for f in sorted(status.unknown): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
411 repo.ui.status(_(b'not deleting unknown file %s\n') % uipathfn(f)) |
42213
84bd6ae2d1f6
narrow: also warn when not deleting untracked or ignored files
Martin von Zweigbergk <martinvonz@google.com>
parents:
42192
diff
changeset
|
412 for f in sorted(status.ignored): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
413 repo.ui.status(_(b'not deleting ignored file %s\n') % uipathfn(f)) |
41238
8c366af085f4
narrow: reuse narrowspec.updateworkingcopy() when narrowing
Martin von Zweigbergk <martinvonz@google.com>
parents:
41229
diff
changeset
|
414 for f in clean + trackeddirty: |
47752
5bcd305389c7
narrow: stop using `drop` in the `updateworkingcopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47739
diff
changeset
|
415 ds.update_file(f, p1_tracked=False, wc_tracked=False) |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
416 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
417 pctx = repo[b'.'] |
47314
e4ccc341e65b
narrow: widen when files are excluded by sparse and not included by narrow
Charles Chamberlain <cchamberlain@janestreet.com>
parents:
46645
diff
changeset
|
418 |
e4ccc341e65b
narrow: widen when files are excluded by sparse and not included by narrow
Charles Chamberlain <cchamberlain@janestreet.com>
parents:
46645
diff
changeset
|
419 # only update added files that are in the sparse checkout |
e4ccc341e65b
narrow: widen when files are excluded by sparse and not included by narrow
Charles Chamberlain <cchamberlain@janestreet.com>
parents:
46645
diff
changeset
|
420 addedmatch = matchmod.intersectmatchers(addedmatch, sparse.matcher(repo)) |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
421 newfiles = [f for f in pctx.manifest().walk(addedmatch) if f not in ds] |
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
422 for f in newfiles: |
47739
6a06155dfaef
narrow: use `update_file` instead of `normallookup` after update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47314
diff
changeset
|
423 ds.update_file(f, p1_tracked=True, wc_tracked=True, possibly_dirty=True) |
41046
ce0bc2952e2a
narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents:
41044
diff
changeset
|
424 _writeaddedfiles(repo, pctx, newfiles) |
42430
4738c292a520
narrowspec: replace one recursion-avoidance hack with another
Martin von Zweigbergk <martinvonz@google.com>
parents:
42423
diff
changeset
|
425 repo._updatingnarrowspec = False |