changeset 9123:360f61c2919f

Make patch.diff filelog cache LRU of 20 files. Fixes issue1738. 20 files is as fast as 200 for hg diff -r 28015:30103 of mozilla-central. Ideally we'd use util.lrucachefunc, but the interface doesn't quite work.
author Brendan Cully <brendan@kublai.com>
date Tue, 14 Jul 2009 16:50:37 -0700
parents a9eae2f3241c
children 632df73485ae 8b58f53b9c35 6d1f9238824e
files mercurial/patch.py
diffstat 1 files changed, 15 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/patch.py	Tue Jul 14 17:12:12 2009 -0300
+++ b/mercurial/patch.py	Tue Jul 14 16:50:37 2009 -0700
@@ -1246,12 +1246,21 @@
     if not node1:
         node1 = repo.dirstate.parents()[0]
 
-    flcache = {}
-    def getfilectx(f, ctx):
-        flctx = ctx.filectx(f, filelog=flcache.get(f))
-        if f not in flcache:
-            flcache[f] = flctx._filelog
-        return flctx
+    def lrugetfilectx():
+        cache = {}
+        order = []
+        def getfilectx(f, ctx):
+            fctx = ctx.filectx(f, filelog=cache.get(f))
+            if f not in cache:
+                if len(cache) > 20:
+                    del cache[order.pop(0)]
+                cache[f] = fctx._filelog
+            else:
+                order.remove(f)
+            order.append(f)
+            return fctx
+        return getfilectx
+    getfilectx = lrugetfilectx()
 
     ctx1 = repo[node1]
     ctx2 = repo[node2]