add: pass full=False to dirstate walk
authorDurham Goode <durham@fb.com>
Wed, 09 Sep 2015 09:07:27 -0700
changeset 26206 ab1c6e4efda4
parent 26205 18e1c555ee49
child 26207 13d664127ee9
add: pass full=False to dirstate walk Previously cmdutil.add would call wctx.walk(), which under the hood calls dirstate.walk with full=True. This means it returns all of the clean files (which we don't need when computing the add set), as well as the unclean files. This results in 1) a lot more work being done and 2) this code path circumventing the hgwatchman extension, resulting in worse performance in hgwatchman environments ('hg add .' went from 9s to 1.8s).
mercurial/cmdutil.py
--- a/mercurial/cmdutil.py	Wed Sep 09 12:40:57 2015 -0700
+++ b/mercurial/cmdutil.py	Wed Sep 09 09:07:27 2015 -0700
@@ -2208,7 +2208,12 @@
     if abort or warn:
         cca = scmutil.casecollisionauditor(ui, abort, repo.dirstate)
 
-    for f in wctx.walk(matchmod.badmatch(match, badfn)):
+    badmatch = matchmod.badmatch(match, badfn)
+    dirstate = repo.dirstate
+    # We don't want to just call wctx.walk here, since it would return a lot of
+    # clean files, which we aren't interested in and takes time.
+    for f in sorted(dirstate.walk(badmatch, sorted(wctx.substate),
+                                  True, False, full=False)):
         exact = match.exact(f)
         if exact or not explicitonly and f not in wctx and repo.wvfs.lexists(f):
             if cca: