[PATCH] match: adding support for repository-root-based globs
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Tue Nov 15 09:21:30 EST 2016
On 11/15/2016 04:59 AM, Rodrigo Damazio Bovendorp via Mercurial-devel wrote:
> # HG changeset patch
> # User Rodrigo Damazio Bovendorp <rdamazio at google.com>
> # Date 1475944120 25200
> # Sat Oct 08 09:28:40 2016 -0700
> # Node ID 93434cce258a797fcc3997c0af994a524695e273
> # Parent b032a7b676c6637b2ac6f3ef29431013b15a08f9
> match: adding support for repository-root-based globs
I saw that Foozy created a plan page about this, it seem to have good
summary of the current matcher we have but from my reading it is a bit
fuzzy about the current variation we have in behavior from one command
to another and from flag usage. I think it is important to have a global
view of the situation here to be able to efficiently tackle the issues
at hand.
I'm traveling in Marocco with poor internet connectivity until the end
of the week. I would prefer if we could not take a final discussion
until I've time to discuss it more at the beginning of next week. Sorry
for the extra delay.
> The broader plan is to add explicit base directories for all patterns:
> ============ ======== ======= ===========
> pattern type root-ed cwd-ed any-of-path
> ============ ======== ======= ===========
> wildcard rootglob cwdglob anyglob
> regexp rootre cwdre anyre
> raw string rootpath cwdpath anypath
> ============ ======== ======= ===========
> (table by foozy)
>
> I'm starting by adding rootglob.
> One important characteristic and difference from the older glob types is
> that rootglob does a *full* match, meaning that a * at the end will never
> match recursively, even when the glob is used as an include pattern.
>
> diff -r b032a7b676c6 -r 93434cce258a mercurial/help/patterns.txt
> --- a/mercurial/help/patterns.txt Tue Nov 01 18:54:03 2016 -0700
> +++ b/mercurial/help/patterns.txt Sat Oct 08 09:28:40 2016 -0700
> @@ -40,6 +40,11 @@
> ``-I`` or ``-X`` options), can match also against directories: files
> under matched directories are treated as matched.
>
> +For ``-I`` and ``-X`` options, ``glob:`` will match directories recursively.
> +``rootglob:``, on the other end, does a full match, meaning that all files, in
> +directories or subdirectories, will only match if the entire expression matches.
> +In that case, ``**`` can be used to obtain recursiveness.
> +
> Plain examples::
>
> path:foo/bar a name bar in a directory named foo in the root
> @@ -48,13 +53,18 @@
>
> Glob examples::
>
> - glob:*.c any name ending in ".c" in the current directory
> - *.c any name ending in ".c" in the current directory
> - **.c any name ending in ".c" in any subdirectory of the
> - current directory including itself.
> - foo/*.c any name ending in ".c" in the directory foo
> - foo/**.c any name ending in ".c" in any subdirectory of foo
> - including itself.
> + glob:*.c any name ending in ".c" in the current directory
> + *.c any name ending in ".c" in the current directory
> + **.c any name ending in ".c" in any subdirectory of the
> + current directory including itself.
> + foo/* any file in directory foo plus all its subdirectories,
> + recursively
> + foo/*.c any name ending in ".c" in the directory foo
> + foo/**.c any name ending in ".c" in any subdirectory of foo
> + including itself.
> + rootglob:*.c any name ending in ".c" in the repository root
> + rootglob:foo/* all files inside foo but not its subdirectories
> + rootglob:foo/** all files inside foo and its subdirectories
>
> Regexp examples::
>
> diff -r b032a7b676c6 -r 93434cce258a mercurial/match.py
> --- a/mercurial/match.py Tue Nov 01 18:54:03 2016 -0700
> +++ b/mercurial/match.py Sat Oct 08 09:28:40 2016 -0700
> @@ -105,6 +105,8 @@
> 'glob:<glob>' - a glob relative to cwd
> 're:<regexp>' - a regular expression
> 'path:<path>' - a path relative to repository root
> + 'rootglob:<path>' - a glob relative to repository root. Unlike glob, *
> + will never match subdirectories.
> 'relglob:<glob>' - an unrooted glob (*.c matches C files in all dirs)
> 'relpath:<path>' - a path relative to cwd
> 'relre:<regexp>' - a regexp that needn't match the start of a name
> @@ -286,7 +288,7 @@
> for kind, pat in [_patsplit(p, default) for p in patterns]:
> if kind in ('glob', 'relpath'):
> pat = pathutil.canonpath(root, cwd, pat, auditor)
> - elif kind in ('relglob', 'path'):
> + elif kind in ('relglob', 'path', 'rootglob'):
> pat = util.normpath(pat)
> elif kind in ('listfile', 'listfile0'):
> try:
> @@ -447,7 +449,8 @@
> if ':' in pattern:
> kind, pat = pattern.split(':', 1)
> if kind in ('re', 'glob', 'path', 'relglob', 'relpath', 'relre',
> - 'listfile', 'listfile0', 'set', 'include', 'subinclude'):
> + 'listfile', 'listfile0', 'set', 'include', 'subinclude',
> + 'rootglob'):
> return kind, pat
> return default, pattern
>
> @@ -540,6 +543,8 @@
> if pat == '.':
> return ''
> return '^' + util.re.escape(pat) + '(?:/|$)'
> + if kind == 'rootglob':
> + return '^' + _globre(pat) + '$'
> if kind == 'relglob':
> return '(?:|.*/)' + _globre(pat) + globsuffix
> if kind == 'relpath':
> @@ -614,6 +619,8 @@
>
> >>> _roots([('glob', 'g/*', ''), ('glob', 'g', ''), ('glob', 'g*', '')])
> ['g', 'g', '.']
> + >>> _roots([('rootglob', 'g/*', ''), ('rootglob', 'g', '')])
> + ['g', 'g']
> >>> _roots([('relpath', 'r', ''), ('path', 'p/p', ''), ('path', '', '')])
> ['r', 'p/p', '.']
> >>> _roots([('relglob', 'rg*', ''), ('re', 're/', ''), ('relre', 'rr', '')])
> @@ -621,7 +628,7 @@
> '''
> r = []
> for kind, pat, source in kindpats:
> - if kind == 'glob': # find the non-glob prefix
> + if kind == 'glob' or kind == 'rootglob': # find the non-glob prefix
> root = []
> for p in pat.split('/'):
> if '[' in p or '{' in p or '*' in p or '?' in p:
> @@ -636,7 +643,7 @@
>
> def _anypats(kindpats):
> for kind, pat, source in kindpats:
> - if kind in ('glob', 're', 'relglob', 'relre', 'set'):
> + if kind in ('glob', 're', 'relglob', 'relre', 'set', 'rootglob'):
> return True
>
> _commentre = None
> diff -r b032a7b676c6 -r 93434cce258a tests/test-walk.t
> --- a/tests/test-walk.t Tue Nov 01 18:54:03 2016 -0700
> +++ b/tests/test-walk.t Sat Oct 08 09:28:40 2016 -0700
> @@ -112,6 +112,69 @@
> f beans/navy ../beans/navy
> f beans/pinto ../beans/pinto
> f beans/turtle ../beans/turtle
> +
> + $ hg debugwalk -I 'rootglob:*'
> + f fennel ../fennel
> + f fenugreek ../fenugreek
> + f fiddlehead ../fiddlehead
> + $ hg debugwalk -I 'rootglob:sk*nk'
> + $ hg debugwalk 'rootglob:sk*nk'
> + $ hg debugwalk -I 'rootglob:*k'
> + f fenugreek ../fenugreek
> + $ hg debugwalk -I 'rootglob:mammals/*'
> + f mammals/skunk skunk
> + $ hg debugwalk 'rootglob:mammals/*'
> + f mammals/skunk skunk
> + $ hg debugwalk -I 'rootglob:**/*u*'
> + f beans/turtle ../beans/turtle
> + f fenugreek ../fenugreek
> + f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
> + f mammals/skunk skunk
> + $ hg debugwalk -I 'rootglob:mammals/**'
> + 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 'rootglob:*a*/*u*'
> + f beans/turtle ../beans/turtle
> + f mammals/skunk skunk
> + $ hg debugwalk 'rootglob:*a*/*u*'
> + f beans/turtle ../beans/turtle
> + f mammals/skunk skunk
> + $ hg debugwalk -X 'rootglob:mammals/*'
> + 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 mammals/Procyonidae/cacomistle Procyonidae/cacomistle
> + f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
> + f mammals/Procyonidae/raccoon Procyonidae/raccoon
> + $ hg debugwalk -X 'rootglob:mammals/**'
> + 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
> + $ hg debugwalk -X 'rootglob:**/*u*'
> + 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 fennel ../fennel
> + f fiddlehead ../fiddlehead
> + f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
> + f mammals/Procyonidae/raccoon Procyonidae/raccoon
> +
> $ hg debugwalk .
> f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
> f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>
--
Pierre-Yves David
More information about the Mercurial-devel
mailing list