[PATCH] dirstate._walkexplicit: don't bother normalizing ''

Siddharth Agarwal sid0 at fb.com
Mon Mar 30 03:40:10 UTC 2015


# HG changeset patch
# User Siddharth Agarwal <sid0 at fb.com>
# Date 1427678928 25200
#      Sun Mar 29 18:28:48 2015 -0700
# Node ID da9074bcbd34008b2615f019fd57d203b80425e1
# Parent  efa094701a05d58d505c3b0c3b3c73dba4e51e97
dirstate._walkexplicit: don't bother normalizing ''

The overwhelmingly common case is running commands like 'hg diff' with no
arguments. Therefore the only file that'll be listed is the root directory.
Normalizing that's just a waste of time.

This means that for a plain 'hg diff' we'll never need to construct the
foldmap, saving us a significant chunk of time.

On case-insensitive HFS+ on OS X, for a large repository with over 200,000
files, this brings down 'hg diff' from 2.97 seconds to 2.36.

diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -635,10 +635,15 @@
 
         alldirs = None
         for ff in files:
-            if normalize:
-                nf = normalize(normpath(ff), False, True)
+            # constructing the foldmap is expensive, so don't do it for the
+            # common case where files is ['']
+            if ff != '':
+                if normalize:
+                    nf = normalize(normpath(ff), False, True)
+                else:
+                    nf = normpath(ff)
             else:
-                nf = normpath(ff)
+                nf = '.'
             if nf in results:
                 continue
 


More information about the Mercurial-devel mailing list