Patchwork [2,of,5] match: optimize visitdir() for when no explicit files are listed

mail settings
Submitter via Mercurial-devel
Date May 30, 2017, 6:50 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/21058/
State Accepted
Headers show


via Mercurial-devel - May 30, 2017, 6:50 a.m.
# HG changeset patch
# User Martin von Zweigbergk <>
# Date 1495349354 25200
#      Sat May 20 23:49:14 2017 -0700
# Node ID b096fab5cc395a8f91d6026f7562573f01274458
# Parent  6be5ea3cf222fd799abff57f42e48da5a764c0a7
match: optimize visitdir() for when no explicit files are listed

In patternmatcher, we used to say that all directories should be
visited if no explicit files were listed, because the case of empty
_files usually implied that no patterns were given (which in turns
meant that everything should match). However, this made e.g. "hg files
-r .  rootfilesin:."  slower than necessary, because that also ended
up with an empty list in _files. Now that patternmatcher does not
handle includes, the only remaining case where its _files/_fileset
fields will be empty is when it's matching everything. We can
therefore treat the always-case specially and stop treating the empty
_files case specially. This makes the case mentioned above faster on
treemanifest repos.


diff --git a/mercurial/ b/mercurial/
--- a/mercurial/
+++ b/mercurial/
@@ -377,10 +377,11 @@ 
         return set(util.dirs(self._fileset)) | {'.'}
     def visitdir(self, dir):
+        if self.always():
+            return 'all'
         if self.prefix() and dir in self._fileset:
             return 'all'
-        return (not self._fileset or
-                '.' in self._fileset or
+        return ('.' in self._fileset or
                 dir in self._fileset or
                 dir in self._dirs or
                 any(parentdir in self._fileset