mercurial/util.py
changeset 4255 ef1f1a4b2efb
parent 4236 34c4540c04c5
child 4256 fe0fe0b4d73b
child 4303 6cecaec07cc9
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: