[PATCH 3 of 3 gca-revset] revset: add a new commonancestorheads method

Yuya Nishihara yuya at tcha.org
Fri Jun 15 07:37:43 EDT 2018


On Fri, 15 Jun 2018 00:10:25 -0700, Sean Farley wrote:
> # HG changeset patch
> # User Sean Farley <sean at farley.io>
> # Date 1527357855 -7200
> #      Sat May 26 20:04:15 2018 +0200
> # Branch gca-revset
> # Node ID d44266127f1a86af521df2b2c088528c3f3b803a
> # Parent  ab29cfd39f48432d8e7c38cdceb62980d5c22f09
> revset: add a new commonancestorheads method
> 
> This is a new revset that provides a public interface to the
> ancestor.commonancestorsheads method. Currently, we have no fast revset
> way to get the ancestors of a list of changesets as returned by the
> consensus bid merge algorithm (the one needed by criss-cross merges).
> 
> Previously, the only way to get these commits were (tested on
> mozilla-central):
> 
> hg perfrevset 'heads(::a7cf55 and ::d8b15)'
> ! wall 4.988366 comb 4.960000 user 4.780000 sys 0.180000 (best of 3)
> 
> After this patch:
> 
> hg perfrevset 'commonancestorheads(a7cf55, d8b15)'
> ! wall 0.001790 comb 0.000000 user 0.000000 sys 0.000000 (best of 1340)
> 
> I'm not a fan of added more revset methods for performance but, yet,
> here we are.
> 
> diff --git a/mercurial/revset.py b/mercurial/revset.py
> index de543df..4004f4b 100644
> --- a/mercurial/revset.py
> +++ b/mercurial/revset.py
> @@ -299,10 +299,34 @@ def adds(repo, subset, x):
>      """
>      # i18n: "adds" is a keyword
>      pat = getstring(x, _("adds requires a pattern"))
>      return checkstatus(repo, subset, pat, 1)
>  
> + at predicate('commonancestorheads(*changeset)', safe=True, weight=0.5)
> +def commonancestorheads(repo, subset, x):
> +    """Returns all greatest common ancestors of the changesets.
> +
> +    Accepts 0 or more changesets. Will return empty list when passed no args.
> +    Greatest common ancestor of a single changeset is that changeset.
> +
> +    These greatest common ancestors the same ones that the consesus bid merge
> +    will find.
> +
> +    """
> +    # i18n: "ancestor" is a keyword

Nit: garbage comment.

> +    from .ancestor import commonancestorsheads as cah

Please move the import line to top. I don't think there's import cycle.

> +    l = getlist(x)
> +    rl = fullreposet(repo)
> +    input_revs = []
> +
> +    # (getset(repo, rl, i) for i in l) generates a list of lists
> +    for revs in (getset(repo, rl, i) for i in l):
> +        for r in revs:
> +            input_revs.append(r)
> +
> +    return subset & cah(repo.changelog.parentrevs, *input_revs)

So, we no longer need the first two patches?

> +  $ hg log -r 'commonancestorheads(head())'
> +  changeset:   1:0f6b37dbe527
> +  user:        test
> +  date:        Thu Jan 01 00:00:00 1970 +0000
> +  summary:     1 first change f1
> +  
> +  changeset:   2:d1d156401c1b
> +  parent:      0:40494bf2444c
> +  user:        test
> +  date:        Thu Jan 01 00:00:00 1970 +0000
> +  summary:     2 first change f2

Can you add a test for variable number (0, 1, 2...) of arguments? I think
that's likely to regress.


More information about the Mercurial-devel mailing list