[PATCH V2] revset: use manifest.matches in _follow revset

Augie Fackler raf at durin42.com
Fri Feb 5 16:47:50 EST 2016


On Fri, Feb 05, 2016 at 01:30:35PM -0800, Durham Goode wrote:
> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1454707825 28800
> #      Fri Feb 05 13:30:25 2016 -0800
> # Node ID 3e36d1273ba86c354729e1876a6585b8ab37a681
> # Parent  01a5143cd25f285f8c745a92986cd7186bb32c90
> revset: use manifest.matches in _follow revset

Very nice. Queued.

>
> The old _follow revset iterated over every file in the commit and checked if it
> matched. For repos with large manifests, this could take 500ms. By switching to
> use manifest.matches() we can take advantage of the fastpaths built in to
> manifest.py that allows iterating over only the files in the matcher when it's a
> simple matcher. This brings the time spent down from 500ms to 0ms during simple
> operations like 'hg log -f file.txt'.
>
> diff --git a/mercurial/revset.py b/mercurial/revset.py
> --- a/mercurial/revset.py
> +++ b/mercurial/revset.py
> @@ -1086,13 +1086,14 @@ def _follow(repo, subset, x, name, follo
>          matcher = matchmod.match(repo.root, repo.getcwd(), [x],
>                                   ctx=repo[None], default='path')
>
> +        files = c.manifest().walk(matcher)
> +
>          s = set()
> -        for fname in c:
> -            if matcher(fname):
> -                fctx = c[fname]
> -                s = s.union(set(c.rev() for c in fctx.ancestors(followfirst)))
> -                # include the revision responsible for the most recent version
> -                s.add(fctx.introrev())
> +        for fname in files:
> +            fctx = c[fname]
> +            s = s.union(set(c.rev() for c in fctx.ancestors(followfirst)))
> +            # include the revision responsible for the most recent version
> +            s.add(fctx.introrev())
>      else:
>          s = _revancestors(repo, baseset([c.rev()]), followfirst)
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list