[PATCH 1 of 2 V2] changectx: increase perf of walk function
Siddharth Agarwal
sid0 at fb.com
Tue Jan 14 19:35:43 CST 2014
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.
More information about the Mercurial-devel
mailing list