##// END OF EJS Templates
narrowspec: limit patterns to path: and rootfilesin: (BC)...
Gregory Szorc -
r39567:0d572769 default
parent child Browse files
Show More
@@ -20,6 +20,15 b' from . import ('
20
20
21 FILENAME = 'narrowspec'
21 FILENAME = 'narrowspec'
22
22
23 # Pattern prefixes that are allowed in narrow patterns. This list MUST
24 # only contain patterns that are fast and safe to evaluate. Keep in mind
25 # that patterns are supplied by clients and executed on remote servers
26 # as part of wire protocol commands.
27 VALID_PREFIXES = (
28 b'path:',
29 b'rootfilesin:',
30 )
31
23 def parseserverpatterns(text):
32 def parseserverpatterns(text):
24 """Parses the narrowspec format that's returned by the server."""
33 """Parses the narrowspec format that's returned by the server."""
25 includepats = set()
34 includepats = set()
@@ -82,8 +91,42 b' def normalizepattern(pattern, defaultkin'
82 return '%s:%s' % normalizesplitpattern(kind, pat)
91 return '%s:%s' % normalizesplitpattern(kind, pat)
83
92
84 def parsepatterns(pats):
93 def parsepatterns(pats):
85 """Parses a list of patterns into a typed pattern set."""
94 """Parses an iterable of patterns into a typed pattern set.
86 return set(normalizepattern(p) for p in pats)
95
96 Patterns are assumed to be ``path:`` if no prefix is present.
97 For safety and performance reasons, only some prefixes are allowed.
98 See ``validatepatterns()``.
99
100 This function should be used on patterns that come from the user to
101 normalize and validate them to the internal data structure used for
102 representing patterns.
103 """
104 res = {normalizepattern(orig) for orig in pats}
105 validatepatterns(res)
106 return res
107
108 def validatepatterns(pats):
109 """Validate that patterns are in the expected data structure and format.
110
111 And that is a set of normalized patterns beginning with ``path:`` or
112 ``rootfilesin:``.
113
114 This function should be used to validate internal data structures
115 and patterns that are loaded from sources that use the internal,
116 prefixed pattern representation (but can't necessarily be fully trusted).
117 """
118 if not isinstance(pats, set):
119 raise error.ProgrammingError('narrow patterns should be a set; '
120 'got %r' % pats)
121
122 for pat in pats:
123 if not pat.startswith(VALID_PREFIXES):
124 # Use a Mercurial exception because this can happen due to user
125 # bugs (e.g. manually updating spec file).
126 raise error.Abort(_('invalid prefix on narrow pattern: %s') % pat,
127 hint=_('narrow patterns must begin with one of '
128 'the following: %s') %
129 ', '.join(VALID_PREFIXES))
87
130
88 def format(includes, excludes):
131 def format(includes, excludes):
89 output = '[include]\n'
132 output = '[include]\n'
@@ -16,6 +16,20 b''
16 $ for x in `$TESTDIR/seq.py 20`; do echo $x > "t$x"; hg add "t$x"; hg commit -m "Commit test $x"; done
16 $ for x in `$TESTDIR/seq.py 20`; do echo $x > "t$x"; hg add "t$x"; hg commit -m "Commit test $x"; done
17 $ cd ../../..
17 $ cd ../../..
18
18
19 Only path: and rootfilesin: pattern prefixes are allowed
20
21 $ hg clone --narrow ssh://user@dummy/master badnarrow --noupdate --include 'glob:**'
22 requesting all changes
23 abort: invalid prefix on narrow pattern: glob:**
24 (narrow patterns must begin with one of the following: path:, rootfilesin:)
25 [255]
26
27 $ hg clone --narrow ssh://user@dummy/master badnarrow --noupdate --exclude 'set:ignored'
28 requesting all changes
29 abort: invalid prefix on narrow pattern: set:ignored
30 (narrow patterns must begin with one of the following: path:, rootfilesin:)
31 [255]
32
19 narrow clone a file, f10
33 narrow clone a file, f10
20
34
21 $ hg clone --narrow ssh://user@dummy/master narrow --noupdate --include "dir/src/f10"
35 $ hg clone --narrow ssh://user@dummy/master narrow --noupdate --include "dir/src/f10"
@@ -254,3 +268,17 b' Testing the --narrowspec flag to clone'
254 I path:dir/tests
268 I path:dir/tests
255 I path:file:dir/src/f12
269 I path:file:dir/src/f12
256 $ cd ..
270 $ cd ..
271
272 Narrow spec with invalid patterns is rejected
273
274 $ cat > narrowspecs <<EOF
275 > [include]
276 > glob:**
277 > EOF
278
279 $ hg clone ssh://user@dummy/master badspecfile --narrowspec narrowspecs
280 reading narrowspec from '$TESTTMP/narrowspecs'
281 requesting all changes
282 abort: invalid prefix on narrow pattern: glob:**
283 (narrow patterns must begin with one of the following: path:, rootfilesin:)
284 [255]
@@ -427,3 +427,15 b' clone a narrow portion of the master, su'
427 |
427 |
428 o 0 2a4f0c3b67da... root
428 o 0 2a4f0c3b67da... root
429
429
430
431 Illegal patterns are rejected
432
433 $ hg tracked --addinclude glob:**
434 abort: invalid prefix on narrow pattern: glob:**
435 (narrow patterns must begin with one of the following: path:, rootfilesin:)
436 [255]
437
438 $ hg tracked --addexclude set:ignored
439 abort: invalid prefix on narrow pattern: set:ignored
440 (narrow patterns must begin with one of the following: path:, rootfilesin:)
441 [255]
General Comments 0
You need to be logged in to leave comments. Login now