RFC: revset relation operator
Matt Mackall
mpm at selenic.com
Tue Oct 13 15:48:06 CDT 2015
On Tue, 2015-10-13 at 13:16 -0700, Durham Goode wrote:
>
> On 10/12/15 7:07 AM, Augie Fackler wrote:
> > On Sun, Oct 11, 2015 at 05:45:24PM -0500, Matt Mackall wrote:
> >> It would be nice if we had a convenience syntax for finding things
> >> related to a given changeset. Currently, we have a couple of these for
> >> parents, ancestors, and descendants.
> >>
> >> foo^ # first parent
> >> foo^2 # second parent
> >> foo^^ # first parent of first parent
> >> foo~2 # same
> >> ::foo # ancestors, inclusive
> >> foo:: # descendants, inclusize
> >>
> >> But we have nothing directly equivalent to parents(), nor any shorthand
> >> for children(), successors(), origin(), destination(), or any other type
> >> of relation we may add. We'd also like a way to specify next, previous,
> >> all, all exclusive, last, etc.
> >>
> >> So my proposal[1] is to add a bracketed postfix (one of {}, [], or <>,
> >> but perhaps {} is the least bad) that looks like this:
> >>
> >> foo{1} # children(foo)
> >> foo{2} # children(children(foo))
> >> foo{} # defaults to 1, so children(foo)
> >> foo{0} # synonym for foo
> >> foo{-1} # parents(foo) (both of 'em)
> >> foo{-} # same
> >> foo{*} # foo:: - foo (exclusive)
> >> foo{**} # foo:: (inclusive)
> >> foo{-*} # ::foo - foo
> >> foo{$} # heads(foo::) aka "the last children"
> >> foo{-4}::foo # last five changesets in a branch
> >>
> >> This makes a lot of our most common expressions shorter. To talk about
> >> other types of relations, we use a suffix character:
> >>
> >> foo{1g} # immediate grafts of foo
> >> foo{-g} # origin for grafts
> >> foo{o} # successor(foo)
> >> foo{$o} # final successor of foo
> > Neat. The one-character suffix thing gives me a little pause as
> > possibly-not-entirely-self-documenting. Maybe it could be whole [a-z]
> > words, and we could allow unambiguous prefixes?
> I thought about using a multidimensional array style syntax for allowing
> full words instead of single letters:
>
> foo{1g} == foo{1, graft}
This form with the comma will definitely trigger shell expansion and
thus require quoting. I'm ok with allowing a space here though:
foo{1g} == foo{1 g} == foo{1 graft}
> which allow for more self-documenting uses.
>
> I also thought about using [] to have the nice side effect of implying a
> array style access:
>
> foo[-1]
> foo[1, graft]
> foo[$][-1o]
This isn't a show-stopper, but the analogy doesn't work well for me. []
is usually an operation on lists or arrays that returns an element
inside that array:
container[integer] -> subelement
The relation operator is an operation on one or more nodes of a graph
(and not the graph as a whole) that return other elements by following
graph edges outward from that set:
set[distance dimension] -> set
If we're going to use [] for something, it should probably be as a way
to replace first/last/limit:
heads()[0] -> first(heads())
heads()[-1] -> last(heads())
heads()[:10] -> limit(heads(), 10)
--
Mathematics is the supreme nostalgia of our time.
More information about the Mercurial-devel
mailing list