[PATCH V2] revset: support ranges in #generations relation
Anton Shestakov
av6 at dwimlabs.net
Thu Jan 17 08:22:05 UTC 2019
On Wed, 16 Jan 2019 23:18:38 +0900
Yuya Nishihara <yuya at tcha.org> wrote:
> On Wed, 16 Jan 2019 18:29:57 +0800, Anton Shestakov wrote:
> > # HG changeset patch
> > # User Anton Shestakov <av6 at dwimlabs.net>
> > # Date 1547564229 -28800
> > # Tue Jan 15 22:57:09 2019 +0800
> > # Node ID 039a0d0d913afac1464bfc1ea8a49b22e803b081
> > # Parent 8aca89a694d4bd7d25877b3652fb83e187ea1802
> > revset: support ranges in #generations relation
>
> The idea sounds good to me.
>
> > +def generationsrel(repo, subset, x, rel, a, b, order):
> > + # TODO: rewrite tests, and drop startdepth argument from ancestors() and
> > + # descendants() predicates
> > + if a < 0 or a is None:
>
> Need to test "is None" first. "None < 0" doesn't work on Py3.
Right, fixed.
> > + if b >= 0 or b is None:
> > + startdepth = 1
>
> Maybe startdepth = 0?
Given foo#g[-1:1], startdepth=0 everywhere would include foo in both
aset and dset, so I do startdepth=1 in one case.
> > + else:
> > + startdepth = -b + 1
> > + if a is None:
> > + stopdepth = None
> > + else:
> > + stopdepth = -a + 1
> > + aset = _ancestors(repo, subset, x, False, startdepth, stopdepth)
> > else:
> > - return _descendants(repo, subset, x, startdepth=n, stopdepth=n + 1)
> > + aset = baseset()
> > +
> > + if b >= 0 or b is None:
> > + if a < 0 or a is None:
> > + startdepth = 0
> > + else:
> > + startdepth = a
> > + stopdepth = b
> > + dset = _descendants(repo, subset, x, False, startdepth, stopdepth)
> > + else:
> > + dset = baseset()
>
> It's probably better to split the function of the range resolution, and add some
> doctests. And it might be actually simpler to write down all conditions
> ({[:], [a:], [:b], [a:b]} x {a, b <= 0, a, b > 0, sgn(a) != sgn(b)}) separately.
I've sent V3 and V4, they handle this feedback item somewhat
differently. Pick whatever you like best, and we'll go from there.
> > + return aset + dset
>
> Nit: "aset" (ancestors set) here is confusing since we have another "a".
That's handled in V4 (but not in V3). Naming in V3 in general is not
perfect.
> > def relsubscriptset(repo, subset, x, y, z, order):
> > # this is pretty basic implementation of 'x#y[z]' operator, still
> > # experimental so undocumented. see the wiki for further ideas.
> > # https://www.mercurial-scm.org/wiki/RevsetOperatorPlan
> > rel = getsymbol(y)
> > - n = getinteger(z, _("relation subscript must be an integer"))
> > + try:
> > + a, b = getrange(z, '')
> > + except error.ParseError:
> > + a = getinteger(z, _("relation subscript must be an integer"))
> > + b = a + 1
>
> Maybe a = b. Unlike python range, a:b in revset is both inclusive.
Yeah, I don't know what's best here: make them work as python ranges or
as revset ranges. I can sort of see arguments for both sides, but I've
went with revset-like behavior in V3/V4.
Thank you for the review!
More information about the Mercurial-devel
mailing list