# HG changeset patch # User Durham Goode # Date 1441814847 25200 # Node ID ab1c6e4efda47281b14a4f5a46cc0d4a114fff7d # Parent 18e1c555ee493b798070829112b0047c1d2c76b2 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). diff -r 18e1c555ee49 -r ab1c6e4efda4 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: