Mercurial > hg
diff tests/test-hgignore.t @ 41282:4fab8a7d2d72
match: support rooted globs in hgignore
In a .hgignore, "glob:foo" always means "**/foo". This cannot be
avoided because there is no syntax like "^" in regexes to say you
don't want the implied "**/" (of course one can use regexes, but glob
syntax is nice).
When you have a long list of fairly specific globs like
path/to/some/thing, this has two consequences:
1. unintended files may be ignored (not too common though)
2. matching performance can suffer significantly
Here is vanilla hg status timing on a private repository:
Using syntax:glob everywhere
real 0m2.199s
user 0m1.545s
sys 0m0.619s
When rooting the appropriate globs
real 0m1.434s
user 0m0.847s
sys 0m0.565s
(tangentially, none of this shows up in --profile's output. It
seems that C code doesn't play well with profiling)
The code already supports this but there is no syntax to make use of
it, so it seems reasonable to create such syntax. I create a new
hgignore syntax "rootglob".
Differential Revision: https://phab.mercurial-scm.org/D5493
author | Valentin Gatien-Baron <vgatien-baron@janestreet.com> |
---|---|
date | Thu, 03 Jan 2019 19:02:46 -0500 |
parents | 3984409e144b |
children | eb8a8af4cbd0 |
line wrap: on
line diff
--- a/tests/test-hgignore.t Wed Nov 07 15:45:09 2018 -0800 +++ b/tests/test-hgignore.t Thu Jan 03 19:02:46 2019 -0500 @@ -239,6 +239,17 @@ dir/c.o is ignored (ignore rule in $TESTTMP/ignorerepo/.hgignore, line 2: 'dir/**/c.o') (glob) +Check rooted globs + + $ hg purge --all --config extensions.purge= + $ echo "syntax: rootglob" > .hgignore + $ echo "a/*.ext" >> .hgignore + $ for p in a b/a aa; do mkdir -p $p; touch $p/b.ext; done + $ hg status -A 'set:**.ext' + ? aa/b.ext + ? b/a/b.ext + I a/b.ext + Check using 'include:' in ignore file $ hg purge --all --config extensions.purge= @@ -257,10 +268,15 @@ Check recursive uses of 'include:' $ echo "include:nested/ignore" >> otherignore - $ mkdir nested + $ mkdir nested nested/more $ echo "glob:*ignore" > nested/ignore + $ echo "rootglob:a" >> nested/ignore + $ touch a nested/a nested/more/a $ hg status A dir/b.o + ? nested/a + ? nested/more/a + $ rm a nested/a nested/more/a $ cp otherignore goodignore $ echo "include:badignore" >> otherignore @@ -291,18 +307,26 @@ ? dir1/file2 ? dir2/file1 -Check including subincludes with regexs +Check including subincludes with other patterns $ echo "subinclude:dir1/.hgignore" >> .hgignore + + $ mkdir dir1/subdir + $ touch dir1/subdir/file1 + $ echo "rootglob:f?le1" > dir1/.hgignore + $ hg status + ? dir1/file2 + ? dir1/subdir/file1 + ? dir2/file1 + $ rm dir1/subdir/file1 + $ echo "regexp:f.le1" > dir1/.hgignore - $ hg status ? dir1/file2 ? dir2/file1 Check multiple levels of sub-ignores - $ mkdir dir1/subdir $ touch dir1/subdir/subfile1 dir1/subdir/subfile3 dir1/subdir/subfile4 $ echo "subinclude:subdir/.hgignore" >> dir1/.hgignore $ echo "glob:subfil*3" >> dir1/subdir/.hgignore