[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