[PATCH STABLE] rebase: improve base revset performance

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue Oct 21 05:25:33 UTC 2014



On 10/20/2014 07:11 PM, Durham Goode wrote:
> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1413856209 25200
> #      Mon Oct 20 18:50:09 2014 -0700
> # Node ID 1a9990727f5d75d70bb0d00fdffac571449574b6
> # Parent  67cb1ab1ad1db6a66b96ac0c0333256b5383a3a2
> rebase: improve base revset performance
>
> The old revset had pretty terrible performance on large repositories (12+
> seconds). This new revset achieves the same result in only 0.7s. As we improve
> the underlying revset APIs we can probably get this revset down to 'only(base,
> dest)::', but at the moment that version still takes 2s.
>
> diff --git a/hgext/rebase.py b/hgext/rebase.py
> --- a/hgext/rebase.py
> +++ b/hgext/rebase.py
> @@ -272,9 +272,9 @@ def rebase(ui, repo, **opts):
>                       ui.status(_('empty "base" revision set - '
>                                   "can't compute rebase set\n"))
>                       return 1
> -                rebaseset = repo.revs(
> -                    '(children(ancestor(%ld, %d)) and ::(%ld))::',
> -                    base, dest, base)
> +                commonanc = repo.revs('ancestor(%ld, %d)', base, dest).first()
> +                rebaseset = repo.revs('(%d::(%ld) - %d)::',
> +                                      commonanc, base, commonanc)

So we suffer here from the cost of `::(X)` and the unability of storing 
the ancestors call in a variable.

I wonder if if we can get similar performance by limiting the walk of 
`::(X)` with the min of the subset.

There is probably no value for going through revset got the ancestors 
call. We could call the ancestors code directly.

Not sure about stable suitability.

>                   if not rebaseset:
>                       # transform to list because smartsets are not comparable to
>                       # lists. This should be improved to honor lazyness of

-- 
Pierre-Yves David



More information about the Mercurial-devel mailing list