# HG changeset patch # User Durham Goode # Date 2014-01-14 21:49:19 # Node ID 8dc254198a8f7ec51e459d3804fe0de91a17979a # Parent 7d589d923b8a1ae7b920a88cf66a79d3faa330b5 changectx: increase perf of walk function When running 'hg cat -r . ' it was doing an expensive ctx.walk(m) which applied the regex to every file in the manifest. This changes changectx.walk to iterate over just the files in the regex, if no other patterns are specified. This cuts hg cat time by 50% in our repo and probably benefits a few other commands as well. diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -410,6 +410,15 @@ class changectx(basectx): # for dirstate.walk, files=['.'] means "walk the whole tree". # follow that here, too fset.discard('.') + + # avoid the entire walk if we're only looking for specific files + if fset and not match.anypats(): + if util.all([fn in self for fn in fset]): + for fn in sorted(fset): + if match(fn): + yield fn + raise StopIteration + for fn in self: if fn in fset: # specified pattern is the exact name