# HG changeset patch # User Alexis S. L. Carvalho # Date 1173579693 10800 # Node ID b5d1eaade333af8e0ba773bd66c04dba5d6016f6 # Parent ba51a8225a60197b5e45e3b30943a6ad3a83712f# Parent ec932167c3a7dcb99cb1c5ef5f93c6d88d2443fc Merge a bunch of matcher and locate fixes. diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -125,21 +125,16 @@ def make_file(repo, pat, node=None, pathname), mode) -def matchpats(repo, pats=[], opts={}, head='', globbed=False): +def matchpats(repo, pats=[], opts={}, globbed=False, default=None): cwd = repo.getcwd() - if not pats and cwd: - opts['include'] = [os.path.join(cwd, i) - for i in opts.get('include', [])] - opts['exclude'] = [os.path.join(cwd, x) - for x in opts.get('exclude', [])] - cwd = '' - return util.cmdmatcher(repo.root, cwd, pats or ['.'], opts.get('include'), - opts.get('exclude'), head, globbed=globbed) + return util.cmdmatcher(repo.root, cwd, pats or [], opts.get('include'), + opts.get('exclude'), globbed=globbed, + default=default) -def walk(repo, pats=[], opts={}, node=None, head='', badmatch=None, - globbed=False): - files, matchfn, anypats = matchpats(repo, pats, opts, head, - globbed=globbed) +def walk(repo, pats=[], opts={}, node=None, badmatch=None, globbed=False, + default=None): + files, matchfn, anypats = matchpats(repo, pats, opts, globbed=globbed, + default=default) exact = dict.fromkeys(files) for src, fn in repo.walk(node=node, files=files, match=matchfn, badmatch=badmatch): diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -1599,9 +1599,8 @@ def locate(ui, repo, *pats, **opts): Print all files under Mercurial control whose names match the given patterns. - This command searches the current directory and its - subdirectories. To search an entire repository, move to the root - of the repository. + This command searches the entire repository by default. To search + just the current directory and its subdirectories, use "--include .". If no patterns are given to match, this command prints all file names. @@ -1618,14 +1617,18 @@ def locate(ui, repo, *pats, **opts): else: node = None + ret = 1 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts, node=node, - head='(?:.*/|)'): + default='relglob'): if not node and repo.dirstate.state(abs) == '?': continue if opts['fullpath']: ui.write(os.path.join(repo.root, abs), end) else: ui.write(((pats and rel) or abs), end) + ret = 0 + + return ret def log(ui, repo, *pats, **opts): """show revision history of entire repository or files diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -386,7 +386,10 @@ class dirstate(object): return False return match(file_) - if ignored: imatch = match + ignore = self.ignore + if ignored: + imatch = match + ignore = util.never # self.root may end with a path separator when self.root == '/' common_prefix_len = len(self.root) @@ -421,8 +424,7 @@ class dirstate(object): # don't trip over symlinks st = os.lstat(p) if stat.S_ISDIR(st.st_mode): - ds = util.pconvert(os.path.join(nd, f +'/')) - if imatch(ds): + if not ignore(p): work.append(p) if directories: yield 'd', np, st diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -873,7 +873,13 @@ class localrepository(repo.repository): if node: fdict = dict.fromkeys(files) - for fn in self.manifest.read(self.changelog.read(node)[0]): + # for dirstate.walk, files=['.'] means "walk the whole tree". + # follow that here, too + fdict.pop('.', None) + mdict = self.manifest.read(self.changelog.read(node)[0]) + mfiles = mdict.keys() + mfiles.sort() + for fn in mfiles: for ffn in fdict: # match if the file is the exact name or a directory if ffn == fn or fn.startswith("%s/" % ffn): @@ -881,7 +887,9 @@ class localrepository(repo.repository): break if match(fn): yield 'm', fn - for fn in fdict: + ffiles = fdict.keys() + ffiles.sort() + for fn in ffiles: if badmatch and badmatch(fn): if match(fn): yield 'b', fn diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -464,17 +464,6 @@ def diff(repo, node1=None, node2=None, f if not changes: changes = repo.status(node1, node2, files, match=match)[:5] modified, added, removed, deleted, unknown = changes - if files: - def filterfiles(filters): - l = [x for x in filters if x in files] - - for t in files: - if not t.endswith("/"): - t += "/" - l += [x for x in filters if x.startswith(t)] - return l - - modified, added, removed = map(filterfiles, (modified, added, removed)) if not modified and not added and not removed: return diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -389,16 +389,17 @@ def canonpath(root, cwd, myname): raise Abort('%s not under root' % myname) -def matcher(canonroot, cwd='', names=['.'], inc=[], exc=[], head='', src=None): - return _matcher(canonroot, cwd, names, inc, exc, head, 'glob', src) +def matcher(canonroot, cwd='', names=[], inc=[], exc=[], src=None): + return _matcher(canonroot, cwd, names, inc, exc, 'glob', src) -def cmdmatcher(canonroot, cwd='', names=['.'], inc=[], exc=[], head='', - src=None, globbed=False): - if not globbed: +def cmdmatcher(canonroot, cwd='', names=[], inc=[], exc=[], src=None, + globbed=False, default=None): + default = default or 'relpath' + if default == 'relpath' and not globbed: names = expand_glob(names) - return _matcher(canonroot, cwd, names, inc, exc, head, 'relpath', src) + return _matcher(canonroot, cwd, names, inc, exc, default, src) -def _matcher(canonroot, cwd, names, inc, exc, head, dflt_pat, src): +def _matcher(canonroot, cwd, names, inc, exc, dflt_pat, src): """build a function to match a set of file patterns arguments: @@ -407,26 +408,30 @@ def _matcher(canonroot, cwd, names, inc, names - patterns to find inc - patterns to include exc - patterns to exclude - head - a regex to prepend to patterns to control whether a match is rooted + dflt_pat - if a pattern in names has no explicit type, assume this one + src - where these patterns came from (e.g. .hgignore) a pattern is one of: - 'glob:' - 're:' - 'path:' - 'relglob:' - 'relpath:' - 'relre:' - '' + 'glob:' - a glob relative to cwd + 're:' - a regular expression + 'path:' - a path relative to canonroot + 'relglob:' - an unrooted glob (*.c matches C files in all dirs) + 'relpath:' - a path relative to cwd + 'relre:' - a regexp that doesn't have to match the start of a name + '' - one of the cases above, selected by the dflt_pat argument returns: a 3-tuple containing - - list of explicit non-pattern names passed in + - list of roots (places where one should start a recursive walk of the fs); + this often matches the explicit non-pattern names passed in, but also + includes the initial part of glob: patterns that has no glob characters - a bool match(filename) function - a bool indicating if any patterns were passed in + """ - todo: - make head regex a rooted bool - """ + # a common case: no patterns at all + if not names and not inc and not exc: + return [], always, False def contains_glob(name): for c in name: @@ -435,19 +440,21 @@ def _matcher(canonroot, cwd, names, inc, def regex(kind, name, tail): '''convert a pattern into a regular expression''' + if not name: + return '' if kind == 're': return name elif kind == 'path': return '^' + re.escape(name) + '(?:/|$)' elif kind == 'relglob': - return head + globre(name, '(?:|.*/)', tail) + return globre(name, '(?:|.*/)', '(?:/|$)') elif kind == 'relpath': - return head + re.escape(name) + tail + return re.escape(name) + '(?:/|$)' elif kind == 'relre': if name.startswith('^'): return name return '.*' + name - return head + globre(name, '', tail) + return globre(name, '', tail) def matchfn(pats, tail): """build a matching function from a set of patterns""" @@ -473,46 +480,53 @@ def _matcher(canonroot, cwd, names, inc, def globprefix(pat): '''return the non-glob prefix of a path, e.g. foo/* -> foo''' root = [] - for p in pat.split(os.sep): + for p in pat.split('/'): if contains_glob(p): break root.append(p) - return '/'.join(root) + 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) - if name == '': - kind, name = 'glob', '**' - if kind in ('glob', 'path', 're'): - pats.append((kind, name)) - if kind == 'glob': - root = globprefix(name) - if root: roots.append(root) - elif kind == 'relpath': - files.append((kind, name)) - roots.append(name) + 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 pats != [('glob', '**')])) and True) + if not names and inc and not exc: + # common case: hgignore patterns + match = incmatch + else: + match = lambda fn: incmatch(fn) and not excmatch(fn) and patmatch(fn) + + return (roots, match, (inc or exc or anypats) and True) def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None): '''enhanced shell command execution. diff --git a/tests/test-backout.out b/tests/test-backout.out --- a/tests/test-backout.out +++ b/tests/test-backout.out @@ -28,7 +28,6 @@ reverting a changeset 3:4cbb1e70196a backs out changeset 1:22bca4c721e5 the backout changeset is a new head - do not forget to merge (use "backout --merge" if you want to auto-merge) -b: No such file or directory adding a adding b adding c diff --git a/tests/test-git-import.out b/tests/test-git-import.out --- a/tests/test-git-import.out +++ b/tests/test-git-import.out @@ -31,7 +31,6 @@ a a % rename and modify applying patch from stdin -copy2: No such file or directory a a b @@ -40,7 +39,6 @@ a % one file renamed multiple times applying patch from stdin 9 rename2 rename3 rename3-2 / rename3 (rename2)rename3-2 (rename2) -rename2: No such file or directory rename3 rename3-2 a diff --git a/tests/test-issue352 b/tests/test-issue352 --- a/tests/test-issue352 +++ b/tests/test-issue352 @@ -6,16 +6,17 @@ cd foo A=`echo -e -n 'he\rllo'` -echo foo > "hell -o" echo foo > "$A" hg add hg ci -A -m m rm "$A" -ls + +echo foo > "hell +o" hg add -# BUG ? we don't walk on filenames with '\n' (regexp related) ? -hg debugwalk hg ci -A -m m +echo foo > "$A" +hg debugwalk + exit 0 diff --git a/tests/test-issue352.out b/tests/test-issue352.out --- a/tests/test-issue352.out +++ b/tests/test-issue352.out @@ -2,6 +2,13 @@ adding he llo abort: '\n' and '\r' disallowed in filenames adding he llo abort: '\n' and '\r' disallowed in filenames -hell +adding hell +o +abort: '\n' and '\r' disallowed in filenames +adding hell o -nothing changed +abort: '\n' and '\r' disallowed in filenames +f he llo he llo +f hell +o hell +o diff --git a/tests/test-locate b/tests/test-locate --- a/tests/test-locate +++ b/tests/test-locate @@ -10,8 +10,8 @@ mkdir t echo 0 > t/x hg ci -A -m m -d "1000000 0" touch nottracked -hg locate a -hg locate NONEXISTENT +hg locate a && echo locate succeeded || echo locate failed +hg locate NONEXISTENT && echo locate succeeded || echo locate failed hg locate hg rm a hg ci -m m -d "1000000 0" diff --git a/tests/test-locate.out b/tests/test-locate.out --- a/tests/test-locate.out +++ b/tests/test-locate.out @@ -3,22 +3,20 @@ adding b adding t.h adding t/x a -NONEXISTENT: No such file or directory +locate succeeded +locate failed a b t.h t/x -a: No such file or directory -NONEXISTENT: No such file or directory b t.h t/x a -NONEXISTENT: No such file in rev ce18e5bc5cd3 a -t/x b t.h +t/x % -I/-X with relative path should work b t.h diff --git a/tests/test-walk b/tests/test-walk --- a/tests/test-walk +++ b/tests/test-walk @@ -1,5 +1,19 @@ #!/bin/sh +debugwalk() +{ + echo "hg debugwalk $@" + hg debugwalk "$@" + echo +} + +chdir() +{ + echo "cd $@" + cd "$@" + echo +} + mkdir t cd t hg init @@ -18,44 +32,61 @@ echo fiddlehead > fiddlehead echo glob:glob > glob:glob hg addremove hg commit -m "commit #0" -d "1000000 0" -hg debugwalk -cd mammals -hg debugwalk . -hg debugwalk Procyonidae -cd Procyonidae -hg debugwalk . -hg debugwalk .. -cd .. -hg debugwalk ../beans -hg debugwalk . -hg debugwalk .hg -hg debugwalk ../.hg -cd .. -hg debugwalk -Ibeans -hg debugwalk 'glob:mammals/../beans/b*' -hg debugwalk '-X*/Procyonidae' mammals -hg debugwalk path:mammals -hg debugwalk .. -hg debugwalk beans/../.. -hg debugwalk .hg -hg debugwalk beans/../.hg -hg debugwalk beans/../.hg/data -hg debugwalk beans/.hg +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 +chdir Procyonidae +debugwalk . +debugwalk .. +chdir .. +debugwalk ../beans +debugwalk . +debugwalk .hg +debugwalk ../.hg +chdir .. +debugwalk -Ibeans +debugwalk 'glob:mammals/../beans/b*' +debugwalk '-X*/Procyonidae' mammals +debugwalk path:mammals +debugwalk .. +debugwalk beans/../.. +debugwalk .hg +debugwalk beans/../.hg +debugwalk beans/../.hg/data +debugwalk beans/.hg # Don't know how to test absolute paths without always getting a false # error. -#hg debugwalk `pwd`/beans -#hg debugwalk `pwd`/.. -hg debugwalk glob:\* -hg debugwalk 're:.*[kb]$' -hg debugwalk path:beans/black -hg debugwalk beans 'glob:beans/*' -hg debugwalk 'glob:j*' -hg debugwalk NOEXIST +#debugwalk `pwd`/beans +#debugwalk `pwd`/.. +debugwalk glob:\* +debugwalk 're:.*[kb]$' +debugwalk path:beans/black +debugwalk path:beans//black +debugwalk relglob:Procyonidae +debugwalk relglob:Procyonidae/ fennel +debugwalk beans 'glob:beans/*' +debugwalk 'glob:mamm**' +debugwalk 'glob:mamm**' fennel +debugwalk 'glob:j*' +debugwalk NOEXIST mkfifo fifo -hg debugwalk fifo +debugwalk fifo rm fenugreek -hg debugwalk fenugreek +debugwalk fenugreek hg rm fenugreek -hg debugwalk fenugreek +debugwalk fenugreek touch new -hg debugwalk new +debugwalk new diff --git a/tests/test-walk.out b/tests/test-walk.out --- a/tests/test-walk.out +++ b/tests/test-walk.out @@ -12,6 +12,23 @@ adding mammals/Procyonidae/cacomistle adding mammals/Procyonidae/coatimundi adding mammals/Procyonidae/raccoon adding mammals/skunk +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 mammals/Procyonidae/cacomistle +f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi +f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon +f mammals/skunk mammals/skunk + +hg debugwalk -I. f beans/black beans/black f beans/borlotti beans/borlotti f beans/kidney beans/kidney @@ -26,72 +43,236 @@ f mammals/Procyonidae/cacomistle mamma f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon f mammals/skunk mammals/skunk + +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/Procyonidae/cacomistle cacomistle -f mammals/Procyonidae/coatimundi coatimundi -f mammals/Procyonidae/raccoon raccoon -f mammals/Procyonidae/cacomistle cacomistle -f mammals/Procyonidae/coatimundi coatimundi -f mammals/Procyonidae/raccoon raccoon -f mammals/skunk ../skunk +f mammals/skunk skunk + +hg debugwalk -I *k +f mammals/skunk skunk + +hg debugwalk -I glob:*k +f mammals/skunk skunk + +hg debugwalk -I relglob:*k +f beans/black ../beans/black +f fenugreek ../fenugreek +f mammals/skunk skunk + +hg debugwalk -I relglob:*k . +f mammals/skunk skunk + +hg debugwalk -I re:.*k$ +f beans/black ../beans/black +f fenugreek ../fenugreek +f mammals/skunk skunk + +hg debugwalk -I relre:.*k$ +f beans/black ../beans/black +f fenugreek ../fenugreek +f 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 +f mammals/Procyonidae/raccoon Procyonidae/raccoon +f mammals/skunk skunk + +hg debugwalk -I. f mammals/Procyonidae/cacomistle Procyonidae/cacomistle f mammals/Procyonidae/coatimundi Procyonidae/coatimundi f mammals/Procyonidae/raccoon Procyonidae/raccoon f mammals/skunk skunk + +hg debugwalk Procyonidae +f mammals/Procyonidae/cacomistle Procyonidae/cacomistle +f mammals/Procyonidae/coatimundi Procyonidae/coatimundi +f mammals/Procyonidae/raccoon Procyonidae/raccoon + +cd Procyonidae + +hg debugwalk . +f mammals/Procyonidae/cacomistle cacomistle +f mammals/Procyonidae/coatimundi coatimundi +f mammals/Procyonidae/raccoon raccoon + +hg debugwalk .. +f mammals/Procyonidae/cacomistle cacomistle +f mammals/Procyonidae/coatimundi coatimundi +f mammals/Procyonidae/raccoon raccoon +f mammals/skunk ../skunk + +cd .. + +hg debugwalk ../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 +f mammals/Procyonidae/raccoon Procyonidae/raccoon +f mammals/skunk skunk + +hg debugwalk .hg .hg: No such file or directory + +hg debugwalk ../.hg abort: path contains illegal component: .hg + +cd .. + +hg debugwalk -Ibeans 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 glob:mammals/../beans/b* f beans/black beans/black f beans/borlotti beans/borlotti + +hg debugwalk -X*/Procyonidae mammals f mammals/skunk mammals/skunk + +hg debugwalk path:mammals f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon f mammals/skunk mammals/skunk + +hg debugwalk .. abort: .. not under root + +hg debugwalk beans/../.. abort: beans/../.. not under root + +hg debugwalk .hg abort: path contains illegal component: .hg + +hg debugwalk beans/../.hg abort: path contains illegal component: .hg + +hg debugwalk beans/../.hg/data abort: path contains illegal component: .hg/data + +hg debugwalk beans/.hg beans/.hg: No such file or directory + +hg debugwalk glob:* f fennel fennel f fenugreek fenugreek f fiddlehead fiddlehead f glob:glob glob:glob + +hg debugwalk re:.*[kb]$ f beans/black beans/black f fenugreek fenugreek f glob:glob glob:glob f mammals/skunk mammals/skunk -f beans/black beans/black + +hg debugwalk path:beans/black +f beans/black beans/black exact + +hg debugwalk path:beans//black +f beans/black beans/black exact + +hg debugwalk relglob:Procyonidae +f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle +f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi +f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon + +hg debugwalk relglob:Procyonidae/ fennel +f fennel fennel exact +f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle +f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi +f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon + +hg debugwalk beans glob: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 glob:mamm** +f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle +f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi +f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon +f mammals/skunk mammals/skunk + +hg debugwalk glob:mamm** fennel +f fennel fennel exact +f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle +f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi +f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon +f mammals/skunk mammals/skunk + +hg debugwalk glob:j* + +hg debugwalk NOEXIST NOEXIST: No such file or directory + +hg debugwalk fifo fifo: unsupported file type (type is fifo) + +hg debugwalk fenugreek m fenugreek fenugreek exact + +hg debugwalk fenugreek m fenugreek fenugreek exact + +hg debugwalk new f new new exact +