changeset 5201:0f6a1bdf89fb

match: handle large regexes Some Python versions don't handle large regexes, so when we hit an overflow, split our regex in two.
author Matt Mackall <mpm@selenic.com>
date Sun, 19 Aug 2007 14:03:56 -0500
parents 6d5ed61c508c
children 1108c952cca1 bddb4ff134c0
files mercurial/util.py
diffstat 1 files changed, 9 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/util.py	Fri Aug 17 22:43:38 2007 -0300
+++ b/mercurial/util.py	Sun Aug 19 14:03:56 2007 -0500
@@ -476,6 +476,15 @@
         try:
             pat = '(?:%s)' % '|'.join([regex(k, p, tail) for (k, p) in pats])
             return re.compile(pat).match
+        except OverflowError:
+            # We're using a Python with a tiny regex engine and we
+            # made it explode, so we'll divide the pattern list in two
+            # until it works
+            l = len(pats)
+            if l < 2:
+                raise
+            a, b = matchfn(pats[:l/2], tail), matchfn(pats[l/2:], tail)
+            return lambda s: a(s) or b(s)
         except re.error:
             for k, p in pats:
                 try: