comparison mercurial/util.py @ 4187:9814d600011e

util._matcher: unify pattern normalization This should fix issue347. It also highlights one issue with the directory walking code when you have an --include pattern that matches the end of a filename. This is fixed by the next patch.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Sat, 10 Mar 2007 23:00:53 -0300
parents 769bc4af561d
children dd0d9bd91e0a
comparison
equal deleted inserted replaced
4186:02de0f98ca33 4187:9814d600011e
435 elif kind == 'path': 435 elif kind == 'path':
436 return '^' + re.escape(name) + '(?:/|$)' 436 return '^' + re.escape(name) + '(?:/|$)'
437 elif kind == 'relglob': 437 elif kind == 'relglob':
438 return head + globre(name, '(?:|.*/)', '(?:/|$)') 438 return head + globre(name, '(?:|.*/)', '(?:/|$)')
439 elif kind == 'relpath': 439 elif kind == 'relpath':
440 return head + re.escape(name) + tail 440 return head + re.escape(name) + '(?:/|$)'
441 elif kind == 'relre': 441 elif kind == 'relre':
442 if name.startswith('^'): 442 if name.startswith('^'):
443 return name 443 return name
444 return '.*' + name 444 return '.*' + name
445 return head + globre(name, '', tail) 445 return head + globre(name, '', tail)
471 for p in pat.split('/'): 471 for p in pat.split('/'):
472 if contains_glob(p): break 472 if contains_glob(p): break
473 root.append(p) 473 root.append(p)
474 return '/'.join(root) or '.' 474 return '/'.join(root) or '.'
475 475
476 pats = [] 476 def normalizepats(names, default):
477 files = [] 477 pats = []
478 roots = [] 478 files = []
479 for kind, name in [patkind(p, dflt_pat) for p in names]: 479 roots = []
480 if kind in ('glob', 'relpath'): 480 anypats = False
481 name = canonpath(canonroot, cwd, name) 481 for kind, name in [patkind(p, default) for p in names]:
482 elif kind in ('relglob', 'path'): 482 if kind in ('glob', 'relpath'):
483 name = normpath(name) 483 name = canonpath(canonroot, cwd, name)
484 if kind in ('glob', 're', 'relglob'): 484 elif kind in ('relglob', 'path'):
485 pats.append((kind, name)) 485 name = normpath(name)
486 if kind == 'glob': 486 if kind in ('glob', 're', 'relglob', 'relre'):
487 root = globprefix(name) 487 pats.append((kind, name))
488 roots.append(root) 488 anypats = True
489 elif kind in ('relpath', 'path'): 489 if kind == 'glob':
490 files.append((kind, name)) 490 root = globprefix(name)
491 roots.append(name) 491 roots.append(root)
492 elif kind == 'relglob': 492 elif kind in ('relpath', 'path'):
493 roots.append('.') 493 files.append((kind, name))
494 roots.append(name)
495 elif kind == 'relglob':
496 roots.append('.')
497 return roots, pats + files, anypats
498
499 roots, pats, anypats = normalizepats(names, dflt_pat)
494 500
495 patmatch = matchfn(pats, '$') or always 501 patmatch = matchfn(pats, '$') or always
496 filematch = matchfn(files, '(?:/|$)') or always
497 incmatch = always 502 incmatch = always
498 if inc: 503 if inc:
499 inckinds = [patkind(canonpath(canonroot, cwd, i)) for i in inc] 504 dummy, inckinds, dummy = normalizepats(inc, 'glob')
500 incmatch = matchfn(inckinds, '(?:/|$)') 505 incmatch = matchfn(inckinds, '(?:/|$)')
501 excmatch = lambda fn: False 506 excmatch = lambda fn: False
502 if exc: 507 if exc:
503 exckinds = [patkind(canonpath(canonroot, cwd, x)) for x in exc] 508 dummy, exckinds, dummy = normalizepats(exc, 'glob')
504 excmatch = matchfn(exckinds, '(?:/|$)') 509 excmatch = matchfn(exckinds, '(?:/|$)')
505 510
506 return (roots, 511 return (roots,
507 lambda fn: (incmatch(fn) and not excmatch(fn) and 512 lambda fn: (incmatch(fn) and not excmatch(fn) and
508 (fn.endswith('/') or 513 (fn.endswith('/') or patmatch(fn))),
509 (not pats and not files) or 514 (inc or exc or anypats) and True)
510 (pats and patmatch(fn)) or
511 (files and filematch(fn)))),
512 (inc or exc or pats) and True)
513 515
514 def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None): 516 def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None):
515 '''enhanced shell command execution. 517 '''enhanced shell command execution.
516 run with environment maybe modified, maybe in different dir. 518 run with environment maybe modified, maybe in different dir.
517 519