[PATCH] match: adding support for repository-root-based globs
Rodrigo Damazio
rdamazio at google.com
Wed Nov 23 22:54:04 EST 2016
Pierre-Yves, hope you had a great time in Morocco :) Any other comments
here?
On Tue, Nov 15, 2016 at 6:21 AM, Pierre-Yves David <
pierre-yves.david at ens-lyon.org> wrote:
>
>
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20161123/f0750763/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4847 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20161123/f0750763/attachment.bin>
More information about the Mercurial-devel
mailing list