From patchwork Sun Feb 10 14:42:33 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [3, of, 3] addremove: don't audit the path for paths already in the dirstate From: Durham Goode X-Patchwork-Id: 935 Message-Id: <2d86e4cb01afea6559a9.1360507353@dev350.prn1.facebook.com> To: mercurial-devel@selenic.com Date: Sun, 10 Feb 2013 06:42:33 -0800 # HG changeset patch # User Durham Goode # Date 1360103779 28800 # Node ID 2d86e4cb01afea6559a957473888681697b584e7 # Parent 6342bd478cbe84999aab99fc05c24717de73b5e5 addremove: don't audit the path for paths already in the dirstate Now that dirstate.walk returns None for paths under symlink directories, addremove doesn't need to validate each path it sees to look for files under symlinks. On a large repository this brings addremove from 6.3 seconds down to 3.65 (42%) since addremove no longer has to stat every directory of every file to determine if the file is inside a symlink directory. I put it through our benchmark and see no perf hit to any other commands. diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -752,17 +752,14 @@ ctx = repo[None] walkresults = repo.dirstate.walk(m, sorted(ctx.substate), True, False) for abs in sorted(walkresults): - good = audit_path.check(abs) - st = walkresults[abs] dstate = repo.dirstate[abs] - if good and dstate == '?': + if dstate == '?' and audit_path.check(abs): unknown.append(abs) if repo.ui.verbose or not m.exact(abs): rel = m.rel(abs) repo.ui.status(_('adding %s\n') % ((pats and rel) or abs)) - elif (dstate != 'r' and - (not good or not st or + elif (dstate != 'r' and (not st or (stat.S_ISDIR(st.st_mode) and not stat.S_ISLNK(st.st_mode)))): deleted.append(abs) if repo.ui.verbose or not m.exact(abs):