comparison mercurial/utils/stringutil.py @ 45722:d502caab76bc

stringutil: extract helper function that splits stringmatcher() pattern
author Yuya Nishihara <yuya@tcha.org>
date Mon, 05 Oct 2020 20:53:34 +0900
parents c1ccefb513e4
children edfc5820aae7
comparison
equal deleted inserted replaced
45721:f9d3ff23bfc0 45722:d502caab76bc
305 def binary(s): 305 def binary(s):
306 """return true if a string is binary data""" 306 """return true if a string is binary data"""
307 return bool(s and b'\0' in s) 307 return bool(s and b'\0' in s)
308 308
309 309
310 def _splitpattern(pattern):
311 if pattern.startswith(b're:'):
312 return b're', pattern[3:]
313 elif pattern.startswith(b'literal:'):
314 return b'literal', pattern[8:]
315 return b'literal', pattern
316
317
310 def stringmatcher(pattern, casesensitive=True): 318 def stringmatcher(pattern, casesensitive=True):
311 """ 319 """
312 accepts a string, possibly starting with 're:' or 'literal:' prefix. 320 accepts a string, possibly starting with 're:' or 'literal:' prefix.
313 returns the matcher name, pattern, and matcher function. 321 returns the matcher name, pattern, and matcher function.
314 missing or unknown prefixes are treated as literal matches. 322 missing or unknown prefixes are treated as literal matches.
343 351
344 case insensitive literal matches 352 case insensitive literal matches
345 >>> itest(b'ABCDEFG', b'abc', b'def', b'abcdefg') 353 >>> itest(b'ABCDEFG', b'abc', b'def', b'abcdefg')
346 ('literal', 'ABCDEFG', [False, False, True]) 354 ('literal', 'ABCDEFG', [False, False, True])
347 """ 355 """
348 if pattern.startswith(b're:'): 356 kind, pattern = _splitpattern(pattern)
349 pattern = pattern[3:] 357 if kind == b're':
350 try: 358 try:
351 flags = 0 359 flags = 0
352 if not casesensitive: 360 if not casesensitive:
353 flags = remod.I 361 flags = remod.I
354 regex = remod.compile(pattern, flags) 362 regex = remod.compile(pattern, flags)
355 except remod.error as e: 363 except remod.error as e:
356 raise error.ParseError(_(b'invalid regular expression: %s') % e) 364 raise error.ParseError(_(b'invalid regular expression: %s') % e)
357 return b're', pattern, regex.search 365 return kind, pattern, regex.search
358 elif pattern.startswith(b'literal:'): 366 elif kind == b'literal':
359 pattern = pattern[8:] 367 if casesensitive:
360 368 match = pattern.__eq__
361 match = pattern.__eq__ 369 else:
362 370 ipat = encoding.lower(pattern)
363 if not casesensitive: 371 match = lambda s: ipat == encoding.lower(s)
364 ipat = encoding.lower(pattern) 372 return kind, pattern, match
365 match = lambda s: ipat == encoding.lower(s) 373
366 return b'literal', pattern, match 374 raise error.ProgrammingError(b'unhandled pattern kind: %s' % kind)
367 375
368 376
369 def shortuser(user): 377 def shortuser(user):
370 """Return a short representation of a user name or email address.""" 378 """Return a short representation of a user name or email address."""
371 f = user.find(b'@') 379 f = user.find(b'@')