Mercurial > hg
comparison mercurial/minifileset.py @ 35740:06a757b9e334
minifileset: unify handling of symbol and string patterns
They must be identical for fileset compatibility.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 14 Jan 2018 13:33:56 +0900 |
parents | 735f47b41521 |
children | 73432eee0ac4 |
comparison
equal
deleted
inserted
replaced
35739:9eb5c400f488 | 35740:06a757b9e334 |
---|---|
15 | 15 |
16 def _compile(tree): | 16 def _compile(tree): |
17 if not tree: | 17 if not tree: |
18 raise error.ParseError(_("missing argument")) | 18 raise error.ParseError(_("missing argument")) |
19 op = tree[0] | 19 op = tree[0] |
20 if op == 'symbol': | 20 if op in {'symbol', 'string'}: |
21 name = fileset.getstring(tree, _('invalid file pattern')) | 21 name = fileset.getstring(tree, _('invalid file pattern')) |
22 if name.startswith('**'): # file extension test, ex. "**.tar.gz" | 22 if name.startswith('**'): # file extension test, ex. "**.tar.gz" |
23 ext = name[2:] | 23 ext = name[2:] |
24 for c in ext: | 24 for c in ext: |
25 if c in '*{}[]?/\\': | 25 if c in '*{}[]?/\\': |
26 raise error.ParseError(_('reserved character: %s') % c) | 26 raise error.ParseError(_('reserved character: %s') % c) |
27 return lambda n, s: n.endswith(ext) | 27 return lambda n, s: n.endswith(ext) |
28 raise error.ParseError(_('invalid symbol: %s') % name) | |
29 elif op == 'string': | |
30 # TODO: teach fileset about 'path:', so that this can be a symbol and | 28 # TODO: teach fileset about 'path:', so that this can be a symbol and |
31 # not require quoting. | 29 # not require quoting. |
32 name = fileset.getstring(tree, _('invalid path literal')) | 30 elif name.startswith('path:'): # directory or full path test |
33 if name.startswith('path:'): # directory or full path test | |
34 p = name[5:] # prefix | 31 p = name[5:] # prefix |
35 pl = len(p) | 32 pl = len(p) |
36 f = lambda n, s: n.startswith(p) and (len(n) == pl or n[pl] == '/') | 33 f = lambda n, s: n.startswith(p) and (len(n) == pl or n[pl] == '/') |
37 return f | 34 return f |
38 raise error.ParseError(_("invalid string"), | 35 raise error.ParseError(_("unsupported file pattern"), |
39 hint=_('paths must be prefixed with "path:"')) | 36 hint=_('paths must be prefixed with "path:"')) |
40 elif op == 'or': | 37 elif op == 'or': |
41 func1 = _compile(tree[1]) | 38 func1 = _compile(tree[1]) |
42 func2 = _compile(tree[2]) | 39 func2 = _compile(tree[2]) |
43 return lambda n, s: func1(n, s) or func2(n, s) | 40 return lambda n, s: func1(n, s) or func2(n, s) |