[PATCH 1 of 2 V2] changectx: increase perf of walk function
Durham Goode
durham at fb.com
Tue Jan 14 20:00:53 CST 2014
On 1/14/14 5:35 PM, "Siddharth Agarwal" <sid0 at fb.com> wrote:
>On 01/14/2014 01:52 PM, Durham Goode wrote:
>> # HG changeset patch
>> # User Durham Goode <durham at fb.com>
>> # Date 1389736159 28800
>> # Tue Jan 14 13:49:19 2014 -0800
>> # Node ID 9c531e73a03eb7ddd809da0778d98612ae41134e
>> # Parent 47d0843647d1e32f6af4482867327cec5db11a1f
>> changectx: increase perf of walk function
>>
>> When running 'hg cat -r . <file>' 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 @@
>> # 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
>
>I think you don't need 'if match(fn)': since fset is derived from
>match.files(), you should just be able to yield fn.
>
I originally did that, but largefiles abuses match by setting it's own
function to match.matchfn and building some state for every matched file
name. So I still need to call match on hits.
More information about the Mercurial-devel
mailing list