##// END OF EJS Templates
rust-filepatterns: call new Rust implementations from Python...
Raphaël Gomès -
r42516:c7652f74 default
parent child Browse files
Show More
@@ -24,6 +24,12 b' from .utils import ('
24 stringutil,
24 stringutil,
25 )
25 )
26
26
27 try:
28 from . import rustext
29 rustext.__name__ # force actual import (see hgdemandimport)
30 except ImportError:
31 rustext = None
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',
@@ -1175,8 +1181,22 b' def _globre(pat):'
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':
@@ -1418,9 +1438,24 b' def readpatternfile(filepath, warn, sour'
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 '''
1423
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
1458
1424 syntaxes = {
1459 syntaxes = {
1425 're': 'relre:',
1460 're': 'relre:',
1426 'regexp': 'relre:',
1461 'regexp': 'relre:',
@@ -115,6 +115,11 b' substitutions = ['
115 # Various platform error strings, keyed on a common replacement string
115 # Various platform error strings, keyed on a common replacement string
116 _errors = {
116 _errors = {
117 br'$ENOENT$': (
117 br'$ENOENT$': (
118 # IOError in Python does not have the same error message
119 # than in Rust, and automatic conversion is not possible
120 # because of module member privacy.
121 br'No such file or directory \(os error 2\)',
122
118 # strerror()
123 # strerror()
119 br'No such file or directory',
124 br'No such file or directory',
120
125
General Comments 0
You need to be logged in to leave comments. Login now