Show More
@@ -9,6 +9,14 b' import re' | |||||
9 | import scmutil, util, fileset |
|
9 | import scmutil, util, fileset | |
10 | from i18n import _ |
|
10 | from i18n import _ | |
11 |
|
11 | |||
|
12 | def _rematcher(pat): | |||
|
13 | m = util.compilere(pat) | |||
|
14 | try: | |||
|
15 | # slightly faster, provided by facebook's re2 bindings | |||
|
16 | return m.test_match | |||
|
17 | except AttributeError: | |||
|
18 | return m.match | |||
|
19 | ||||
12 | def _expandsets(pats, ctx): |
|
20 | def _expandsets(pats, ctx): | |
13 | '''convert set: patterns into a list of files in the given context''' |
|
21 | '''convert set: patterns into a list of files in the given context''' | |
14 | fset = set() |
|
22 | fset = set() | |
@@ -280,7 +288,7 b' def _buildregexmatch(pats, tail):' | |||||
280 | pat = '(?:%s)' % '|'.join([_regex(k, p, tail) for (k, p) in pats]) |
|
288 | pat = '(?:%s)' % '|'.join([_regex(k, p, tail) for (k, p) in pats]) | |
281 | if len(pat) > 20000: |
|
289 | if len(pat) > 20000: | |
282 | raise OverflowError |
|
290 | raise OverflowError | |
283 |
return pat, |
|
291 | return pat, _rematcher(pat) | |
284 | except OverflowError: |
|
292 | except OverflowError: | |
285 | # We're using a Python with a tiny regex engine and we |
|
293 | # We're using a Python with a tiny regex engine and we | |
286 | # made it explode, so we'll divide the pattern list in two |
|
294 | # made it explode, so we'll divide the pattern list in two | |
@@ -294,7 +302,7 b' def _buildregexmatch(pats, tail):' | |||||
294 | except re.error: |
|
302 | except re.error: | |
295 | for k, p in pats: |
|
303 | for k, p in pats: | |
296 | try: |
|
304 | try: | |
297 |
|
|
305 | _rematcher('(?:%s)' % _regex(k, p, tail)) | |
298 | except re.error: |
|
306 | except re.error: | |
299 | raise util.Abort(_("invalid pattern (%s): %s") % (k, p)) |
|
307 | raise util.Abort(_("invalid pattern (%s): %s") % (k, p)) | |
300 | raise util.Abort(_("invalid pattern")) |
|
308 | raise util.Abort(_("invalid pattern")) |
@@ -629,6 +629,30 b' def checkcase(path):' | |||||
629 | except OSError: |
|
629 | except OSError: | |
630 | return True |
|
630 | return True | |
631 |
|
631 | |||
|
632 | try: | |||
|
633 | import re2 | |||
|
634 | _re2 = None | |||
|
635 | except ImportError: | |||
|
636 | _re2 = False | |||
|
637 | ||||
|
638 | def compilere(pat): | |||
|
639 | '''Compile a regular expression, using re2 if possible | |||
|
640 | ||||
|
641 | For best performance, use only re2-compatible regexp features.''' | |||
|
642 | global _re2 | |||
|
643 | if _re2 is None: | |||
|
644 | try: | |||
|
645 | re2.compile | |||
|
646 | _re2 = True | |||
|
647 | except ImportError: | |||
|
648 | _re2 = False | |||
|
649 | if _re2: | |||
|
650 | try: | |||
|
651 | return re2.compile(pat) | |||
|
652 | except re2.error: | |||
|
653 | pass | |||
|
654 | return re.compile(pat) | |||
|
655 | ||||
632 | _fspathcache = {} |
|
656 | _fspathcache = {} | |
633 | def fspath(name, root): |
|
657 | def fspath(name, root): | |
634 | '''Get name in the case stored in the filesystem |
|
658 | '''Get name in the case stored in the filesystem |
General Comments 0
You need to be logged in to leave comments.
Login now