Mercurial > public > mercurial-scm > hg
comparison mercurial/util.py @ 4192: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
4191:02de0f98ca33 | 4192: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 |