Mercurial > hg
comparison mercurial/match.py @ 42329:c7652f7440d9
rust-filepatterns: call new Rust implementations from Python
This change adds the import to the `rust-cpython` bindings and uses
them when appropriate.
A wrapper function has been defined in the case of `_regex` to
keep this patch simple.
Differential Revision: https://phab.mercurial-scm.org/D6273
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Fri, 17 May 2019 09:36:29 -0400 |
parents | 7edff8dd46a7 |
children | 27d6956d386b |
comparison
equal
deleted
inserted
replaced
42328:94f3a73b6672 | 42329:c7652f7440d9 |
---|---|
21 util, | 21 util, |
22 ) | 22 ) |
23 from .utils import ( | 23 from .utils import ( |
24 stringutil, | 24 stringutil, |
25 ) | 25 ) |
26 | |
27 try: | |
28 from . import rustext | |
29 rustext.__name__ # force actual import (see hgdemandimport) | |
30 except ImportError: | |
31 rustext = None | |
26 | 32 |
27 allpatternkinds = ('re', 'glob', 'path', 'relglob', 'relpath', 'relre', | 33 allpatternkinds = ('re', 'glob', 'path', 'relglob', 'relpath', 'relre', |
28 'rootglob', | 34 'rootglob', |
29 'listfile', 'listfile0', 'set', 'include', 'subinclude', | 35 'listfile', 'listfile0', 'set', 'include', 'subinclude', |
30 'rootfilesin') | 36 'rootfilesin') |
1173 else: | 1179 else: |
1174 res += escape(c, c) | 1180 res += escape(c, c) |
1175 return res | 1181 return res |
1176 | 1182 |
1177 def _regex(kind, pat, globsuffix): | 1183 def _regex(kind, pat, globsuffix): |
1178 '''Convert a (normalized) pattern of any kind into a regular expression. | 1184 '''Convert a (normalized) pattern of any kind into a |
1185 regular expression. | |
1179 globsuffix is appended to the regexp of globs.''' | 1186 globsuffix is appended to the regexp of globs.''' |
1187 | |
1188 if rustext is not None: | |
1189 try: | |
1190 return rustext.filepatterns.build_single_regex( | |
1191 kind, | |
1192 pat, | |
1193 globsuffix | |
1194 ) | |
1195 except rustext.filepatterns.PatternError: | |
1196 raise error.ProgrammingError( | |
1197 'not a regex pattern: %s:%s' % (kind, pat) | |
1198 ) | |
1199 | |
1180 if not pat: | 1200 if not pat: |
1181 return '' | 1201 return '' |
1182 if kind == 're': | 1202 if kind == 're': |
1183 return pat | 1203 return pat |
1184 if kind in ('path', 'relpath'): | 1204 if kind in ('path', 'relpath'): |
1416 glob:pattern # non-rooted glob | 1436 glob:pattern # non-rooted glob |
1417 rootglob:pat # rooted glob (same root as ^ in regexps) | 1437 rootglob:pat # rooted glob (same root as ^ in regexps) |
1418 pattern # pattern of the current default type | 1438 pattern # pattern of the current default type |
1419 | 1439 |
1420 if sourceinfo is set, returns a list of tuples: | 1440 if sourceinfo is set, returns a list of tuples: |
1421 (pattern, lineno, originalline). This is useful to debug ignore patterns. | 1441 (pattern, lineno, originalline). |
1442 This is useful to debug ignore patterns. | |
1422 ''' | 1443 ''' |
1444 | |
1445 if rustext is not None: | |
1446 result, warnings = rustext.filepatterns.read_pattern_file( | |
1447 filepath, | |
1448 bool(warn), | |
1449 sourceinfo, | |
1450 ) | |
1451 | |
1452 for warning_params in warnings: | |
1453 # Can't be easily emitted from Rust, because it would require | |
1454 # a mechanism for both gettext and calling the `warn` function. | |
1455 warn(_("%s: ignoring invalid syntax '%s'\n") % warning_params) | |
1456 | |
1457 return result | |
1423 | 1458 |
1424 syntaxes = { | 1459 syntaxes = { |
1425 're': 'relre:', | 1460 're': 'relre:', |
1426 'regexp': 'relre:', | 1461 'regexp': 'relre:', |
1427 'glob': 'relglob:', | 1462 'glob': 'relglob:', |