Mercurial > hg
changeset 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 | 94f3a73b6672 |
children | 5364ba1f796f |
files | mercurial/match.py tests/common-pattern.py |
diffstat | 2 files changed, 42 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/match.py Fri May 17 09:36:29 2019 -0400 +++ b/mercurial/match.py Fri May 17 09:36:29 2019 -0400 @@ -24,6 +24,12 @@ stringutil, ) +try: + from . import rustext + rustext.__name__ # force actual import (see hgdemandimport) +except ImportError: + rustext = None + allpatternkinds = ('re', 'glob', 'path', 'relglob', 'relpath', 'relre', 'rootglob', 'listfile', 'listfile0', 'set', 'include', 'subinclude', @@ -1175,8 +1181,22 @@ return res def _regex(kind, pat, globsuffix): - '''Convert a (normalized) pattern of any kind into a regular expression. + '''Convert a (normalized) pattern of any kind into a + regular expression. globsuffix is appended to the regexp of globs.''' + + if rustext is not None: + try: + return rustext.filepatterns.build_single_regex( + kind, + pat, + globsuffix + ) + except rustext.filepatterns.PatternError: + raise error.ProgrammingError( + 'not a regex pattern: %s:%s' % (kind, pat) + ) + if not pat: return '' if kind == 're': @@ -1418,9 +1438,24 @@ pattern # pattern of the current default type if sourceinfo is set, returns a list of tuples: - (pattern, lineno, originalline). This is useful to debug ignore patterns. + (pattern, lineno, originalline). + This is useful to debug ignore patterns. ''' + if rustext is not None: + result, warnings = rustext.filepatterns.read_pattern_file( + filepath, + bool(warn), + sourceinfo, + ) + + for warning_params in warnings: + # Can't be easily emitted from Rust, because it would require + # a mechanism for both gettext and calling the `warn` function. + warn(_("%s: ignoring invalid syntax '%s'\n") % warning_params) + + return result + syntaxes = { 're': 'relre:', 'regexp': 'relre:',
--- a/tests/common-pattern.py Fri May 17 09:36:29 2019 -0400 +++ b/tests/common-pattern.py Fri May 17 09:36:29 2019 -0400 @@ -115,6 +115,11 @@ # Various platform error strings, keyed on a common replacement string _errors = { br'$ENOENT$': ( + # IOError in Python does not have the same error message + # than in Rust, and automatic conversion is not possible + # because of module member privacy. + br'No such file or directory \(os error 2\)', + # strerror() br'No such file or directory',