[PATCH] addremove: don't do full walks

Siddharth Agarwal sid0 at fb.com
Wed Sep 4 20:48:06 CDT 2013


# HG changeset patch
# User Siddharth Agarwal <sid0 at fb.com>
# Date 1378345375 25200
#      Wed Sep 04 18:42:55 2013 -0700
# Node ID c11bcb87c9338b29a67fc6e260d50b9a18705994
# Parent  5e8173f8486bce989a7439bd8ca24078864a62d8
addremove: don't do full walks

Full walks are only necessary when the caller needs the list of clean files.
addremove by definition doesn't need them.

With this patch and an extension that produces a subset of results for
dirstate.walk when full is False, on a repository with over 200,000 files, hg
addremove drops from 2.8 seconds to 0.5.

diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -755,7 +755,8 @@
 
     ctx = repo[None]
     dirstate = repo.dirstate
-    walkresults = dirstate.walk(matcher, sorted(ctx.substate), True, False)
+    walkresults = dirstate.walk(matcher, sorted(ctx.substate), True, False,
+                                full=False)
     for abs, st in walkresults.iteritems():
         dstate = dirstate[abs]
         if dstate == '?' and audit_path.check(abs):


More information about the Mercurial-devel mailing list