[PATCH 1 of 6 V2] hidden: add a function returning ancestors of revs within a domain

Martin von Zweigbergk martinvonz at google.com
Tue May 23 20:04:43 EDT 2017


On Tue, May 23, 2017 at 1:02 PM, Pierre-Yves David
<pierre-yves.david at ens-lyon.org> wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at octobus.net>
> # Date 1495372906 -7200
> #      Sun May 21 15:21:46 2017 +0200
> # Node ID 5f964af88a0fae242ce24b0478c676d2056e0dc6
> # Parent  8db2feb04cebc1878c6232dd2650f2c5468d350e
> # EXP-Topic fast-compute-hidden
> # Available At https://www.mercurial-scm.org/repo/users/marmoute/mercurial/
> #              hg pull https://www.mercurial-scm.org/repo/users/marmoute/mercurial/ -r 5f964af88a0f
> hidden: add a function returning ancestors of revs within a domain
>
> See documentation for details. This will be used to improve the hidden
> computation algorithm. See new changesets for usage.
>
> diff --git a/mercurial/repoview.py b/mercurial/repoview.py
> --- a/mercurial/repoview.py
> +++ b/mercurial/repoview.py
> @@ -92,6 +92,31 @@ def _getstatichidden(repo):
>                      heappush(heap, -parent)
>      return hidden
>
> +def _domainancestors(pfunc, revs, domain):
> +    """return ancestors of 'revs' within 'domain'
> +
> +    - pfunc(r): a funtion returning parent of 'r',
> +    - revs: iterable of revnum,
> +    - domain: consistent set of revnum.
> +
> +    The domain must be consistent: no connected subset are the ancestors of
> +    another connected subset. In other words, if the parents of a revision are
> +    not in the domains, no other ancestors of that revision.
> +
> +    (Ancestors are returned inclusively, 'revs' must be within the domain or
> +    direct children of it.)
> +    """
> +    stack = list(revs)
> +    ancs = set(stack)
> +    while stack:
> +        for p in pfunc(stack.pop()):
> +            nbanc = len(ancs)

s/nb/num/ maybe? I'd also prefer to have "ancestors" spelled out
(which seems ~3x more common so far in our code base according to
"grep -E 'anc(estor)?s = ' mercurial/*.py").

> +            if p != nullrev and p in domain:
> +                ancs.add(p)
> +            if nbanc != len(ancs): # avoid double membership testing
> +                stack.append(p)

The following seems easier to read than the above 5 lines. Does the
comment imply that it's noticeably slower?

if p != nullrev and p in domain and not p in ancs:
  ancs.add(p)
  stack.append(p)

> +    return ancs
> +
>  cacheversion = 1
>  cachefile = 'cache/hidden'
>
> _______________________________________________
> 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