subrepo: cleanup of subrepo filematcher logic
Previously in the worst case we iterated the files in matcher twice and
had a method only for this, which reimplemented logic in subdirmatchers
constructor. So we replaced the method with a subdirmatcher.files() call.
--- a/mercurial/cmdutil.py Sun Aug 14 14:46:24 2016 +0900
+++ b/mercurial/cmdutil.py Tue Aug 16 08:15:12 2016 +0000
@@ -2416,10 +2416,10 @@
ret = 0
for subpath in sorted(ctx.substate):
- if subrepos or m.matchessubrepo(subpath):
+ submatch = matchmod.subdirmatcher(subpath, m)
+ if (subrepos or m.exact(subpath) or any(submatch.files())):
sub = ctx.sub(subpath)
try:
- submatch = matchmod.subdirmatcher(subpath, m)
recurse = m.exact(subpath) or subrepos
if sub.printfiles(ui, submatch, fm, fmt, recurse) == 0:
ret = 0
@@ -2448,12 +2448,11 @@
count = 0
for subpath in subs:
count += 1
- if subrepos or m.matchessubrepo(subpath):
+ submatch = matchmod.subdirmatcher(subpath, m)
+ if subrepos or m.exact(subpath) or any(submatch.files()):
ui.progress(_('searching'), count, total=total, unit=_('subrepos'))
-
sub = wctx.sub(subpath)
try:
- submatch = matchmod.subdirmatcher(subpath, m)
if sub.removefiles(submatch, prefix, after, force, subrepos,
warnings):
ret = 1
--- a/mercurial/scmutil.py Sun Aug 14 14:46:24 2016 +0900
+++ b/mercurial/scmutil.py Tue Aug 16 08:15:12 2016 +0000
@@ -949,10 +949,10 @@
wctx = repo[None]
for subpath in sorted(wctx.substate):
- if opts.get('subrepos') or m.matchessubrepo(subpath):
+ submatch = matchmod.subdirmatcher(subpath, m)
+ if opts.get('subrepos') or m.exact(subpath) or any(submatch.files()):
sub = wctx.sub(subpath)
try:
- submatch = matchmod.subdirmatcher(subpath, m)
if sub.addremove(submatch, prefix, opts, dry_run, similarity):
ret = 1
except error.LookupError: