comparison mercurial/util.py @ 4255:ef1f1a4b2efb

glob:<directory> patterns match the files in that directory. This makes the behaviour of glob: patterns more consistent: hg status glob:dir and hg status -I glob:dir will match the same files. It's also consistent with the fact that {rel,}path patterns recursively match the contents of a directory.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Tue, 20 Mar 2007 22:09:55 -0300
parents 34c4540c04c5
children fe0fe0b4d73b 6cecaec07cc9
comparison
equal deleted inserted replaced
4254:a7cae4e22749 4255:ef1f1a4b2efb
425 def contains_glob(name): 425 def contains_glob(name):
426 for c in name: 426 for c in name:
427 if c in _globchars: return True 427 if c in _globchars: return True
428 return False 428 return False
429 429
430 def regex(kind, name, tail): 430 def regex(kind, name):
431 '''convert a pattern into a regular expression''' 431 '''convert a pattern into a regular expression'''
432 if not name: 432 if not name:
433 return '' 433 return ''
434 if kind == 're': 434 if kind == 're':
435 return name 435 return name
441 return re.escape(name) + '(?:/|$)' 441 return re.escape(name) + '(?:/|$)'
442 elif kind == 'relre': 442 elif kind == 'relre':
443 if name.startswith('^'): 443 if name.startswith('^'):
444 return name 444 return name
445 return '.*' + name 445 return '.*' + name
446 return globre(name, '', tail) 446 return globre(name, '', '(?:/|$)')
447 447
448 def matchfn(pats, tail): 448 def matchfn(pats):
449 """build a matching function from a set of patterns""" 449 """build a matching function from a set of patterns"""
450 if not pats: 450 if not pats:
451 return 451 return
452 matches = [] 452 matches = []
453 for k, p in pats: 453 for k, p in pats:
454 try: 454 try:
455 pat = '(?:%s)' % regex(k, p, tail) 455 pat = '(?:%s)' % regex(k, p)
456 matches.append(re.compile(pat).match) 456 matches.append(re.compile(pat).match)
457 except re.error: 457 except re.error:
458 if src: raise Abort("%s: invalid pattern (%s): %s" % (src, k, p)) 458 if src: raise Abort("%s: invalid pattern (%s): %s" % (src, k, p))
459 else: raise Abort("invalid pattern (%s): %s" % (k, p)) 459 else: raise Abort("invalid pattern (%s): %s" % (k, p))
460 460
498 roots.append('.') 498 roots.append('.')
499 return roots, pats, anypats 499 return roots, pats, anypats
500 500
501 roots, pats, anypats = normalizepats(names, dflt_pat) 501 roots, pats, anypats = normalizepats(names, dflt_pat)
502 502
503 patmatch = matchfn(pats, '$') or always 503 patmatch = matchfn(pats) or always
504 incmatch = always 504 incmatch = always
505 if inc: 505 if inc:
506 dummy, inckinds, dummy = normalizepats(inc, 'glob') 506 dummy, inckinds, dummy = normalizepats(inc, 'glob')
507 incmatch = matchfn(inckinds, '(?:/|$)') 507 incmatch = matchfn(inckinds)
508 excmatch = lambda fn: False 508 excmatch = lambda fn: False
509 if exc: 509 if exc:
510 dummy, exckinds, dummy = normalizepats(exc, 'glob') 510 dummy, exckinds, dummy = normalizepats(exc, 'glob')
511 excmatch = matchfn(exckinds, '(?:/|$)') 511 excmatch = matchfn(exckinds)
512 512
513 if not names and inc and not exc: 513 if not names and inc and not exc:
514 # common case: hgignore patterns 514 # common case: hgignore patterns
515 match = incmatch 515 match = incmatch
516 else: 516 else: