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.
--- a/mercurial/util.py Sat Mar 10 23:00:52 2007 -0300
+++ b/mercurial/util.py Sat Mar 10 23:00:53 2007 -0300
@@ -437,7 +437,7 @@
elif kind == 'relglob':
return head + globre(name, '(?:|.*/)', '(?:/|$)')
elif kind == 'relpath':
- return head + re.escape(name) + tail
+ return head + re.escape(name) + '(?:/|$)'
elif kind == 'relre':
if name.startswith('^'):
return name
@@ -473,43 +473,45 @@
root.append(p)
return '/'.join(root) or '.'
- pats = []
- files = []
- roots = []
- for kind, name in [patkind(p, dflt_pat) for p in names]:
- if kind in ('glob', 'relpath'):
- name = canonpath(canonroot, cwd, name)
- elif kind in ('relglob', 'path'):
- name = normpath(name)
- if kind in ('glob', 're', 'relglob'):
- pats.append((kind, name))
- if kind == 'glob':
- root = globprefix(name)
- roots.append(root)
- elif kind in ('relpath', 'path'):
- files.append((kind, name))
- roots.append(name)
- elif kind == 'relglob':
- roots.append('.')
+ def normalizepats(names, default):
+ pats = []
+ files = []
+ roots = []
+ anypats = False
+ for kind, name in [patkind(p, default) for p in names]:
+ if kind in ('glob', 'relpath'):
+ name = canonpath(canonroot, cwd, name)
+ elif kind in ('relglob', 'path'):
+ name = normpath(name)
+ if kind in ('glob', 're', 'relglob', 'relre'):
+ pats.append((kind, name))
+ anypats = True
+ if kind == 'glob':
+ root = globprefix(name)
+ roots.append(root)
+ elif kind in ('relpath', 'path'):
+ files.append((kind, name))
+ roots.append(name)
+ elif kind == 'relglob':
+ roots.append('.')
+ return roots, pats + files, anypats
+
+ roots, pats, anypats = normalizepats(names, dflt_pat)
patmatch = matchfn(pats, '$') or always
- filematch = matchfn(files, '(?:/|$)') or always
incmatch = always
if inc:
- inckinds = [patkind(canonpath(canonroot, cwd, i)) for i in inc]
+ dummy, inckinds, dummy = normalizepats(inc, 'glob')
incmatch = matchfn(inckinds, '(?:/|$)')
excmatch = lambda fn: False
if exc:
- exckinds = [patkind(canonpath(canonroot, cwd, x)) for x in exc]
+ dummy, exckinds, dummy = normalizepats(exc, 'glob')
excmatch = matchfn(exckinds, '(?:/|$)')
return (roots,
lambda fn: (incmatch(fn) and not excmatch(fn) and
- (fn.endswith('/') or
- (not pats and not files) or
- (pats and patmatch(fn)) or
- (files and filematch(fn)))),
- (inc or exc or pats) and True)
+ (fn.endswith('/') or patmatch(fn))),
+ (inc or exc or anypats) and True)
def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None):
'''enhanced shell command execution.
--- a/tests/test-walk Sat Mar 10 23:00:52 2007 -0300
+++ b/tests/test-walk Sat Mar 10 23:00:53 2007 -0300
@@ -35,6 +35,16 @@
debugwalk
debugwalk -I.
chdir mammals
+debugwalk
+debugwalk -X ../beans
+debugwalk -I '*k'
+debugwalk -I 'glob:*k'
+debugwalk -I 'relglob:*k'
+debugwalk -I 'relglob:*k' .
+debugwalk -I 're:.*k$'
+debugwalk -I 'relre:.*k$'
+debugwalk -I 'path:beans'
+debugwalk -I 'relpath:../beans'
debugwalk .
debugwalk -I.
debugwalk Procyonidae
--- a/tests/test-walk.out Sat Mar 10 23:00:52 2007 -0300
+++ b/tests/test-walk.out Sat Mar 10 23:00:53 2007 -0300
@@ -46,6 +46,72 @@
cd mammals
+hg debugwalk
+f beans/black ../beans/black
+f beans/borlotti ../beans/borlotti
+f beans/kidney ../beans/kidney
+f beans/navy ../beans/navy
+f beans/pinto ../beans/pinto
+f beans/turtle ../beans/turtle
+f fennel ../fennel
+f fenugreek ../fenugreek
+f fiddlehead ../fiddlehead
+f glob:glob ../glob:glob
+f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
+f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
+f mammals/Procyonidae/raccoon Procyonidae/raccoon
+f mammals/skunk skunk
+
+hg debugwalk -X ../beans
+f fennel ../fennel
+f fenugreek ../fenugreek
+f fiddlehead ../fiddlehead
+f glob:glob ../glob:glob
+f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
+f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
+f mammals/Procyonidae/raccoon Procyonidae/raccoon
+f mammals/skunk skunk
+
+hg debugwalk -I *k
+m mammals/skunk skunk
+
+hg debugwalk -I glob:*k
+m mammals/skunk skunk
+
+hg debugwalk -I relglob:*k
+f fenugreek ../fenugreek
+m beans/black ../beans/black
+m mammals/skunk skunk
+
+hg debugwalk -I relglob:*k .
+f mammals/skunk skunk
+
+hg debugwalk -I re:.*k$
+f fenugreek ../fenugreek
+m beans/black ../beans/black
+m mammals/skunk skunk
+
+hg debugwalk -I relre:.*k$
+f fenugreek ../fenugreek
+m beans/black ../beans/black
+m mammals/skunk skunk
+
+hg debugwalk -I path:beans
+f beans/black ../beans/black
+f beans/borlotti ../beans/borlotti
+f beans/kidney ../beans/kidney
+f beans/navy ../beans/navy
+f beans/pinto ../beans/pinto
+f beans/turtle ../beans/turtle
+
+hg debugwalk -I relpath:../beans
+f beans/black ../beans/black
+f beans/borlotti ../beans/borlotti
+f beans/kidney ../beans/kidney
+f beans/navy ../beans/navy
+f beans/pinto ../beans/pinto
+f beans/turtle ../beans/turtle
+
hg debugwalk .
f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
f mammals/Procyonidae/coatimundi Procyonidae/coatimundi