Patchwork [5,of,5] template: add successors template

login
register
mail settings
Submitter Boris Feld
Date July 5, 2017, 8:53 p.m.
Message ID <82e2b4eb96b573dde890.1499288038@FB>
Download mbox | patch
Permalink /patch/22019/
State Accepted
Headers show

Comments

Boris Feld - July 5, 2017, 8:53 p.m.
# HG changeset patch
# User Boris Feld <boris.feld@octobus.net>
# Date 1499073720 -7200
#      Mon Jul 03 11:22:00 2017 +0200
# Node ID 82e2b4eb96b573dde890d725d758dbbc49407133
# Parent  870bfaafd90e030b85b869922050be98f000a9a9
# EXP-Topic successorstemplate
template: add successors template

Add a 'successorssets' template that returns the list of all closest known
sucessorssets for a changectx. The elements of the list are changesets.

The "closest successors" are the first locally known revisions encountered
while, walking successors markers. It uses successorsets previously modified
to support the closest argument.

This logic respect repository filtering. So hidden revision will be skipped by
this logic unless --hidden is specified. Since we only display the visible
predecessors, this template will not display anything in most case. It makes a
good candidate for inclusion in the default log output.

I updated the test-obsmarker-template.t test file introduced with the
predecessors template to test successorssets template.
Augie Fackler - July 6, 2017, 12:45 a.m.
On Wed, Jul 05, 2017 at 10:53:58PM +0200, Boris Feld wrote:
> # HG changeset patch
> # User Boris Feld <boris.feld@octobus.net>
> # Date 1499073720 -7200
> #      Mon Jul 03 11:22:00 2017 +0200
> # Node ID 82e2b4eb96b573dde890d725d758dbbc49407133
> # Parent  870bfaafd90e030b85b869922050be98f000a9a9
> # EXP-Topic successorstemplate
> template: add successors template

queued, thanks

>
> Add a 'successorssets' template that returns the list of all closest known
> sucessorssets for a changectx. The elements of the list are changesets.

I'm not...super in love with the name successorssets, but I have no
better ideas. I'd welcome some bikeshedding in the next ten days.
Yuya Nishihara - July 6, 2017, 2:14 p.m.
On Wed, 05 Jul 2017 22:53:58 +0200, Boris Feld wrote:
> # HG changeset patch
> # User Boris Feld <boris.feld@octobus.net>
> # Date 1499073720 -7200
> #      Mon Jul 03 11:22:00 2017 +0200
> # Node ID 82e2b4eb96b573dde890d725d758dbbc49407133
> # Parent  870bfaafd90e030b85b869922050be98f000a9a9
> # EXP-Topic successorstemplate
> template: add successors template

> +@templatekeyword("successorssets")
> +def showsuccessorssets(repo, ctx, **args):
> +    """Returns a string of sets of successors for a changectx
> +
> +    Format used is: [ctx1, ctx2], [ctx3] if ctx has been splitted into ctx1 and
> +    ctx2 while also diverged into ctx3"""
> +    if not ctx.obsolete():
> +        return ''

Perhaps it should return an empty list.
Sean Farley - July 6, 2017, 6:05 p.m.
Augie Fackler <raf@durin42.com> writes:

> On Wed, Jul 05, 2017 at 10:53:58PM +0200, Boris Feld wrote:
>> # HG changeset patch
>> # User Boris Feld <boris.feld@octobus.net>
>> # Date 1499073720 -7200
>> #      Mon Jul 03 11:22:00 2017 +0200
>> # Node ID 82e2b4eb96b573dde890d725d758dbbc49407133
>> # Parent  870bfaafd90e030b85b869922050be98f000a9a9
>> # EXP-Topic successorstemplate
>> template: add successors template
>
> queued, thanks
>
>>
>> Add a 'successorssets' template that returns the list of all closest known
>> sucessorssets for a changectx. The elements of the list are changesets.
>
> I'm not...super in love with the name successorssets, but I have no
> better ideas. I'd welcome some bikeshedding in the next ten days.

Off the top of my head:

successorgroup
successorlike
similarsuccessors
successorkin
Yuya Nishihara - July 7, 2017, 1:03 p.m.
On Thu, 06 Jul 2017 11:05:22 -0700, Sean Farley wrote:
> Augie Fackler <raf@durin42.com> writes:
> > On Wed, Jul 05, 2017 at 10:53:58PM +0200, Boris Feld wrote:
> >> # HG changeset patch
> >> # User Boris Feld <boris.feld@octobus.net>
> >> # Date 1499073720 -7200
> >> #      Mon Jul 03 11:22:00 2017 +0200
> >> # Node ID 82e2b4eb96b573dde890d725d758dbbc49407133
> >> # Parent  870bfaafd90e030b85b869922050be98f000a9a9
> >> # EXP-Topic successorstemplate
> >> template: add successors template
> >
> > queued, thanks
> >
> >>
> >> Add a 'successorssets' template that returns the list of all closest known
> >> sucessorssets for a changectx. The elements of the list are changesets.
> >
> > I'm not...super in love with the name successorssets, but I have no
> > better ideas. I'd welcome some bikeshedding in the next ten days.
> 
> Off the top of my head:
> 
> successorgroup
> successorlike
> similarsuccessors
> successorkin

No idea which is better, but a name like "similarsuccessors" might be nice
to justify calling the inner list as "successors".

  {similarsuccessors % "{successors % ...}"}
                         ^^^^^^^^^^
              sounds okay, and its actually a partial list of successors

  {successorgroup % "{group % ...}"}
                      ^^^^^
              calling it "successors" seems a bit odd because "group" is noun
Sean Farley - July 7, 2017, 4:35 p.m.
Yuya Nishihara <yuya@tcha.org> writes:

> On Thu, 06 Jul 2017 11:05:22 -0700, Sean Farley wrote:
>> Augie Fackler <raf@durin42.com> writes:
>> > On Wed, Jul 05, 2017 at 10:53:58PM +0200, Boris Feld wrote:
>> >> # HG changeset patch
>> >> # User Boris Feld <boris.feld@octobus.net>
>> >> # Date 1499073720 -7200
>> >> #      Mon Jul 03 11:22:00 2017 +0200
>> >> # Node ID 82e2b4eb96b573dde890d725d758dbbc49407133
>> >> # Parent  870bfaafd90e030b85b869922050be98f000a9a9
>> >> # EXP-Topic successorstemplate
>> >> template: add successors template
>> >
>> > queued, thanks
>> >
>> >>
>> >> Add a 'successorssets' template that returns the list of all closest known
>> >> sucessorssets for a changectx. The elements of the list are changesets.
>> >
>> > I'm not...super in love with the name successorssets, but I have no
>> > better ideas. I'd welcome some bikeshedding in the next ten days.
>> 
>> Off the top of my head:
>> 
>> successorgroup
>> successorlike
>> similarsuccessors
>> successorkin
>
> No idea which is better, but a name like "similarsuccessors" might be nice
> to justify calling the inner list as "successors".
>
>   {similarsuccessors % "{successors % ...}"}
>                          ^^^^^^^^^^
>               sounds okay, and its actually a partial list of successors
>
>   {successorgroup % "{group % ...}"}
>                       ^^^^^
>               calling it "successors" seems a bit odd because "group" is noun

I like similarsuccessors, fwiw. Also, "successors" is a noun as well.
Jun Wu - July 7, 2017, 5:29 p.m.
Excerpts from Sean Farley's message of 2017-07-06 11:05:22 -0700:
> Augie Fackler <raf@durin42.com> writes:
> > On Wed, Jul 05, 2017 at 10:53:58PM +0200, Boris Feld wrote:
> > I'm not...super in love with the name successorssets, but I have no
> > better ideas. I'd welcome some bikeshedding in the next ten days.
> 
> Off the top of my head:
> 
> successorgroup
> successorlike
> similarsuccessors
> successorkin

"group" looks better to me than "similar". "similar" sounds like there is
some filtering logic that removes non-similar ones.

"successorsset" looks okay to me, since "set" and "group" are not that much
different.
via Mercurial-devel - July 7, 2017, 5:39 p.m.
On Fri, Jul 7, 2017 at 10:29 AM, Jun Wu <quark@fb.com> wrote:
> Excerpts from Sean Farley's message of 2017-07-06 11:05:22 -0700:
>> Augie Fackler <raf@durin42.com> writes:
>> > On Wed, Jul 05, 2017 at 10:53:58PM +0200, Boris Feld wrote:
>> > I'm not...super in love with the name successorssets, but I have no
>> > better ideas. I'd welcome some bikeshedding in the next ten days.
>>
>> Off the top of my head:
>>
>> successorgroup
>> successorlike
>> similarsuccessors
>> successorkin
>
> "group" looks better to me than "similar". "similar" sounds like there is
> some filtering logic that removes non-similar ones.
>
> "successorsset" looks okay to me, since "set" and "group" are not that much
> different.

Boris described it as "closest successors", so maybe "closestsuccessors"?

> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
Jun Wu - July 7, 2017, 5:58 p.m.
Excerpts from Martin von Zweigbergk's message of 2017-07-07 10:39:55 -0700:
> Boris described it as "closest successors", so maybe "closestsuccessors"?

Maybe a bit off-topic, but I have been thinking about "predecessors" and
"successors" revsets for a while. It sounds like we could have many
combinations so I was thinking about keyword arguments, like:

    successors(REV, all=False, closest=False)

For example, with two markers: A -> (B, C), B -> (D),

    successors(A) = [C, D]
    successors(A, all=True) = [B, C, D]
    successors(A, closest=True) = [C] (without --hidden)
                                  [B, C] (with --hidden)

Also check my comment on Yuya's revset change [1].

I wonder if we can just implement the revsets, and because there is a
"revset" template function, template gets those features for free.

[1]: https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-July/101140.html
Boris Feld - July 7, 2017, 6:50 p.m.
On Fri, 2017-07-07 at 10:29 -0700, Jun Wu wrote:
> Excerpts from Sean Farley's message of 2017-07-06 11:05:22 -0700:
> > Augie Fackler <raf@durin42.com> writes:
> > > On Wed, Jul 05, 2017 at 10:53:58PM +0200, Boris Feld wrote:
> > > I'm not...super in love with the name successorssets, but I have
> > > no
> > > better ideas. I'd welcome some bikeshedding in the next ten days.
> > 
> > Off the top of my head:
> > 
> > successorgroup
> > successorlike
> > similarsuccessors
> > successorkin
> 
> "group" looks better to me than "similar". "similar" sounds like
> there is
> some filtering logic that removes non-similar ones.

I agree with Jun that similar might send indicates that the successors
are selected or processed in a specific way.

> 
> "successorsset" looks okay to me, since "set" and "group" are not
> that much
> different.

Successorgroup sound good to me, it is less implementation specific and
might be easier to understand for users.

> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
Augie Fackler - July 7, 2017, 6:52 p.m.
> On Jul 7, 2017, at 2:50 PM, Boris Feld <boris.feld@octobus.net> wrote:
> 
>> "successorsset" looks okay to me, since "set" and "group" are not
>> that much
>> different.
> 
> Successorgroup sound good to me, it is less implementation specific and
> might be easier to understand for users.

I think successorgroup is a bit better as well. Can someone mail a followup?
Boris Feld - July 7, 2017, 6:58 p.m.
On Fri, 2017-07-07 at 14:52 -0400, Augie Fackler wrote:
> I think successorgroup is a bit better as well. Can someone mail a
> followup?

I will do
Yuya Nishihara - July 8, 2017, 1:14 a.m.
On Fri, 07 Jul 2017 09:35:48 -0700, Sean Farley wrote:
> Yuya Nishihara <yuya@tcha.org> writes:
> > On Thu, 06 Jul 2017 11:05:22 -0700, Sean Farley wrote:
> >> Augie Fackler <raf@durin42.com> writes:
> >> > On Wed, Jul 05, 2017 at 10:53:58PM +0200, Boris Feld wrote:
> >> >> # HG changeset patch
> >> >> # User Boris Feld <boris.feld@octobus.net>
> >> >> # Date 1499073720 -7200
> >> >> #      Mon Jul 03 11:22:00 2017 +0200
> >> >> # Node ID 82e2b4eb96b573dde890d725d758dbbc49407133
> >> >> # Parent  870bfaafd90e030b85b869922050be98f000a9a9
> >> >> # EXP-Topic successorstemplate
> >> >> template: add successors template
> >> >
> >> > queued, thanks
> >> >
> >> >>
> >> >> Add a 'successorssets' template that returns the list of all closest known
> >> >> sucessorssets for a changectx. The elements of the list are changesets.
> >> >
> >> > I'm not...super in love with the name successorssets, but I have no
> >> > better ideas. I'd welcome some bikeshedding in the next ten days.
> >> 
> >> Off the top of my head:
> >> 
> >> successorgroup
> >> successorlike
> >> similarsuccessors
> >> successorkin
> >
> > No idea which is better, but a name like "similarsuccessors" might be nice
> > to justify calling the inner list as "successors".
> >
> >   {similarsuccessors % "{successors % ...}"}
> >                          ^^^^^^^^^^
> >               sounds okay, and its actually a partial list of successors
> >
> >   {successorgroup % "{group % ...}"}
> >                       ^^^^^
> >               calling it "successors" seems a bit odd because "group" is noun
> 
> I like similarsuccessors, fwiw. Also, "successors" is a noun as well.

I meant "successor" in "successorgroup" is adjective, so can't be a name
pointing to each element.
Sean Farley - July 13, 2017, 7:07 p.m.
Yuya Nishihara <yuya@tcha.org> writes:

> On Fri, 07 Jul 2017 09:35:48 -0700, Sean Farley wrote:
>> Yuya Nishihara <yuya@tcha.org> writes:
>> > On Thu, 06 Jul 2017 11:05:22 -0700, Sean Farley wrote:
>> >> Augie Fackler <raf@durin42.com> writes:
>> >> > On Wed, Jul 05, 2017 at 10:53:58PM +0200, Boris Feld wrote:
>> >> >> # HG changeset patch
>> >> >> # User Boris Feld <boris.feld@octobus.net>
>> >> >> # Date 1499073720 -7200
>> >> >> #      Mon Jul 03 11:22:00 2017 +0200
>> >> >> # Node ID 82e2b4eb96b573dde890d725d758dbbc49407133
>> >> >> # Parent  870bfaafd90e030b85b869922050be98f000a9a9
>> >> >> # EXP-Topic successorstemplate
>> >> >> template: add successors template
>> >> >
>> >> > queued, thanks
>> >> >
>> >> >>
>> >> >> Add a 'successorssets' template that returns the list of all closest known
>> >> >> sucessorssets for a changectx. The elements of the list are changesets.
>> >> >
>> >> > I'm not...super in love with the name successorssets, but I have no
>> >> > better ideas. I'd welcome some bikeshedding in the next ten days.
>> >> 
>> >> Off the top of my head:
>> >> 
>> >> successorgroup
>> >> successorlike
>> >> similarsuccessors
>> >> successorkin
>> >
>> > No idea which is better, but a name like "similarsuccessors" might be nice
>> > to justify calling the inner list as "successors".
>> >
>> >   {similarsuccessors % "{successors % ...}"}
>> >                          ^^^^^^^^^^
>> >               sounds okay, and its actually a partial list of successors
>> >
>> >   {successorgroup % "{group % ...}"}
>> >                       ^^^^^
>> >               calling it "successors" seems a bit odd because "group" is noun
>> 
>> I like similarsuccessors, fwiw. Also, "successors" is a noun as well.
>
> I meant "successor" in "successorgroup" is adjective, so can't be a name
> pointing to each element.

(this is stuck my outgoing queue; sorry)

Ah! I see what you mean now; sorry that I misunderstood. Seems later
discussions take care of this so archiving this thread now.

Patch

diff -r 870bfaafd90e -r 82e2b4eb96b5 mercurial/templatekw.py
--- a/mercurial/templatekw.py	Mon Jul 03 14:22:28 2017 +0200
+++ b/mercurial/templatekw.py	Mon Jul 03 11:22:00 2017 +0200
@@ -602,6 +602,38 @@ 
                    lambda x: {'ctx': repo[x], 'revcache': {}},
                    lambda d: _formatrevnode(d['ctx']))
 
+@templatekeyword("successorssets")
+def showsuccessorssets(repo, ctx, **args):
+    """Returns a string of sets of successors for a changectx
+
+    Format used is: [ctx1, ctx2], [ctx3] if ctx has been splitted into ctx1 and
+    ctx2 while also diverged into ctx3"""
+    if not ctx.obsolete():
+        return ''
+    args = pycompat.byteskwargs(args)
+
+    ssets = obsutil.successorssets(repo, ctx.node(), closest=True)
+    ssets = [[hex(n) for n in ss] for ss in ssets]
+
+    data = []
+    for ss in ssets:
+        h = _hybrid(None, ss, lambda x: {'ctx': repo[x], 'revcache': {}},
+                    lambda d: _formatrevnode(d['ctx']))
+        data.append(h)
+
+    # Format the successorssets
+    def render(d):
+        t = []
+        for i in d.gen:
+            t.append(i)
+        return "".join(t)
+
+    def gen(data):
+        yield "; ".join(render(d) for d in data)
+
+    return _hybrid(gen(data), data, lambda x: {'successorset': x},
+                   lambda d: d["successorset"])
+
 @templatekeyword('p1rev')
 def showp1rev(repo, ctx, templ, **args):
     """Integer. The repository-local revision number of the changeset's
diff -r 870bfaafd90e -r 82e2b4eb96b5 tests/test-obsmarker-template.t
--- a/tests/test-obsmarker-template.t	Mon Jul 03 14:22:28 2017 +0200
+++ b/tests/test-obsmarker-template.t	Mon Jul 03 11:22:00 2017 +0200
@@ -16,7 +16,10 @@ 
   >     {if(predecessors, "\n  Predecessors: {predecessors}")}\
   >     {if(predecessors, "\n  semi-colon: {join(predecessors, "; ")}")}\
   >     {if(predecessors, "\n  json: {predecessors|json}")}\
-  >     {if(predecessors, "\n  map: {join(predecessors % "{rev}:{node}", " ")}")}\n'
+  >     {if(predecessors, "\n  map: {join(predecessors % "{rev}:{node}", " ")}")}\
+  >     {if(successorssets, "\n  Successors: {successorssets}")}\
+  >     {if(successorssets, "\n  multi-line: {join(successorssets, "\n  multi-line: ")}")}\
+  >     {if(successorssets, "\n  json: {successorssets|json}")}\n'
   > EOF
 
 Test templates on amended commit
@@ -75,7 +78,9 @@ 
   |    json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   |    map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
   | @  471f378eab4c
-  |/
+  |/     Successors: 4:d004c8f274b9
+  |      multi-line: 4:d004c8f274b9
+  |      json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
   o  ea207398892e
   
   $ hg up 'desc(A1)' --hidden
@@ -89,7 +94,9 @@ 
   |    json: ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]
   |    map: 3:a468dc9b36338b14fdb7825f55ce3df4e71517ad
   | @  a468dc9b3633
-  |/
+  |/     Successors: 4:d004c8f274b9
+  |      multi-line: 4:d004c8f274b9
+  |      json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
   o  ea207398892e
   
 Predecessors template should show all the predecessors as we force their display
@@ -105,10 +112,15 @@ 
   |      semi-colon: 1:471f378eab4c
   |      json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   |      map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
+  |      Successors: 4:d004c8f274b9
+  |      multi-line: 4:d004c8f274b9
+  |      json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
   | x  f137d23bb3e1
   | |
   | x  471f378eab4c
-  |/
+  |/     Successors: 3:a468dc9b3633
+  |      multi-line: 3:a468dc9b3633
+  |      json: [["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]]
   o  ea207398892e
   
 
@@ -132,10 +144,15 @@ 
   |      semi-colon: 1:471f378eab4c
   |      json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   |      map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
+  |      Successors: 4:d004c8f274b9
+  |      multi-line: 4:d004c8f274b9
+  |      json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
   | x  f137d23bb3e1
   | |
   | x  471f378eab4c
-  |/
+  |/     Successors: 3:a468dc9b3633
+  |      multi-line: 3:a468dc9b3633
+  |      json: [["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]]
   o  ea207398892e
   
 
@@ -216,7 +233,9 @@ 
   |    json: ["471597cad322d1f659bb169751be9133dad92ef3"]
   |    map: 1:471597cad322d1f659bb169751be9133dad92ef3
   | @  471597cad322
-  |/
+  |/     Successors: 2:337fec4d2edc 3:f257fde29c7a
+  |      multi-line: 2:337fec4d2edc 3:f257fde29c7a
+  |      json: [["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]]
   o  ea207398892e
   
   $ hg up f257fde29c7a
@@ -245,7 +264,9 @@ 
   |    json: ["471597cad322d1f659bb169751be9133dad92ef3"]
   |    map: 1:471597cad322d1f659bb169751be9133dad92ef3
   | x  471597cad322
-  |/
+  |/     Successors: 2:337fec4d2edc 3:f257fde29c7a
+  |      multi-line: 2:337fec4d2edc 3:f257fde29c7a
+  |      json: [["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]]
   o  ea207398892e
   
 Test templates with folded commit
@@ -325,7 +346,9 @@ 
   |    json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   |    map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
   | @  471f378eab4c
-  |/
+  |/     Successors: 3:eb5a0daa2192
+  |      multi-line: 3:eb5a0daa2192
+  |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
   $ hg up 'desc(B0)' --hidden
@@ -340,9 +363,13 @@ 
   |    json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
   |    map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
   | @  0dec01379d3b
-  | |
+  | |    Successors: 3:eb5a0daa2192
+  | |    multi-line: 3:eb5a0daa2192
+  | |    json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   | x  471f378eab4c
-  |/
+  |/     Successors: 3:eb5a0daa2192
+  |      multi-line: 3:eb5a0daa2192
+  |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
   $ hg up 'desc(C0)'
@@ -364,9 +391,13 @@ 
   |    json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
   |    map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
   | x  0dec01379d3b
-  | |
+  | |    Successors: 3:eb5a0daa2192
+  | |    multi-line: 3:eb5a0daa2192
+  | |    json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   | x  471f378eab4c
-  |/
+  |/     Successors: 3:eb5a0daa2192
+  |      multi-line: 3:eb5a0daa2192
+  |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
 
@@ -481,7 +512,10 @@ 
   |      json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   |      map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
   | @  471f378eab4c
-  |/
+  |/     Successors: 2:fdf9bde5129a; 4:019fadeab383
+  |      multi-line: 2:fdf9bde5129a
+  |      multi-line: 4:019fadeab383
+  |      json: [["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]]
   o  ea207398892e
   
   $ hg up 'desc(A1)'
@@ -509,13 +543,19 @@ 
   |      semi-colon: 1:471f378eab4c
   |      json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   |      map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
+  |      Successors: 4:019fadeab383
+  |      multi-line: 4:019fadeab383
+  |      json: [["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]]
   | @  fdf9bde5129a
   |/     Predecessors: 1:471f378eab4c
   |      semi-colon: 1:471f378eab4c
   |      json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   |      map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
   | x  471f378eab4c
-  |/
+  |/     Successors: 2:fdf9bde5129a; 3:65b757b745b9
+  |      multi-line: 2:fdf9bde5129a
+  |      multi-line: 3:65b757b745b9
+  |      json: [["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], ["65b757b745b935093c87a2bccd877521cccffcbd"]]
   o  ea207398892e
   
 
@@ -609,7 +649,9 @@ 
   |    json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   |    map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
   | @  471f378eab4c
-  |/
+  |/     Successors: 4:eb5a0daa2192
+  |      multi-line: 4:eb5a0daa2192
+  |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
   $ hg up 'desc(B0)' --hidden
@@ -623,9 +665,13 @@ 
   |    json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
   |    map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
   | @  0dec01379d3b
-  | |
+  | |    Successors: 4:eb5a0daa2192
+  | |    multi-line: 4:eb5a0daa2192
+  | |    json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   | x  471f378eab4c
-  |/
+  |/     Successors: 4:eb5a0daa2192
+  |      multi-line: 4:eb5a0daa2192
+  |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
   $ hg up 'desc(B1)' --hidden
@@ -639,9 +685,13 @@ 
   |    json: ["471f378eab4c5e25f6c77f785b27c936efb22874", "b7ea6d14e664bdc8922221f7992631b50da3fb07"]
   |    map: 1:471f378eab4c5e25f6c77f785b27c936efb22874 3:b7ea6d14e664bdc8922221f7992631b50da3fb07
   | @  b7ea6d14e664
-  | |
+  | |    Successors: 4:eb5a0daa2192
+  | |    multi-line: 4:eb5a0daa2192
+  | |    json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   | x  471f378eab4c
-  |/
+  |/     Successors: 4:eb5a0daa2192
+  |      multi-line: 4:eb5a0daa2192
+  |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
   $ hg up 'desc(C0)'
@@ -666,10 +716,17 @@ 
   | |    semi-colon: 2:0dec01379d3b
   | |    json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
   | |    map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
+  | |    Successors: 4:eb5a0daa2192
+  | |    multi-line: 4:eb5a0daa2192
+  | |    json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   | | x  0dec01379d3b
-  | |/
+  | |/     Successors: 3:b7ea6d14e664
+  | |      multi-line: 3:b7ea6d14e664
+  | |      json: [["b7ea6d14e664bdc8922221f7992631b50da3fb07"]]
   | x  471f378eab4c
-  |/
+  |/     Successors: 4:eb5a0daa2192
+  |      multi-line: 4:eb5a0daa2192
+  |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
 
@@ -770,7 +827,9 @@ 
   |    json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   |    map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
   | @  471f378eab4c
-  |/
+  |/     Successors: 2:7a230b46bf61
+  |      multi-line: 2:7a230b46bf61
+  |      json: [["7a230b46bf61e50b30308c6cfd7bd1269ef54702"]]
   o  ea207398892e
   
   $ hg up 'desc(A2)'
@@ -791,7 +850,9 @@ 
   |    json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   |    map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
   | x  471f378eab4c
-  |/
+  |/     Successors: 2:7a230b46bf61
+  |      multi-line: 2:7a230b46bf61
+  |      json: [["7a230b46bf61e50b30308c6cfd7bd1269ef54702"]]
   o  ea207398892e
   
 
@@ -839,11 +900,18 @@ 
   | |    semi-colon: 1:471f378eab4c
   | |    json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   | |    map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
+  | |    Successors: 3:f897c6137566; 1:471f378eab4c
+  | |    multi-line: 3:f897c6137566
+  | |    multi-line: 1:471f378eab4c
+  | |    json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
   | x  471f378eab4c
   |/     Predecessors: 2:0dec01379d3b
   |      semi-colon: 2:0dec01379d3b
   |      json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
   |      map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
+  |      Successors: 2:0dec01379d3b
+  |      multi-line: 2:0dec01379d3b
+  |      json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
   o  ea207398892e
   
 
@@ -879,11 +947,18 @@ 
   | |    semi-colon: 1:471f378eab4c
   | |    json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   | |    map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
+  | |    Successors: 3:f897c6137566; 1:471f378eab4c
+  | |    multi-line: 3:f897c6137566
+  | |    multi-line: 1:471f378eab4c
+  | |    json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
   | x  471f378eab4c
   |/     Predecessors: 2:0dec01379d3b
   |      semi-colon: 2:0dec01379d3b
   |      json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
   |      map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
+  |      Successors: 2:0dec01379d3b
+  |      multi-line: 2:0dec01379d3b
+  |      json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
   @  ea207398892e
   
 Test template with split + divergence with cycles
@@ -1059,7 +1134,10 @@ 
   | o  ba2ed02b0c9a
   | |
   | x  4a004186e638
-  |/
+  |/     Successors: 8:b18bc8331526; 9:0b997eb7ceee
+  |      multi-line: 8:b18bc8331526
+  |      multi-line: 9:0b997eb7ceee
+  |      json: [["b18bc8331526a22cbb1801022bd1555bf291c48b"], ["0b997eb7ceeee06200a02f8aab185979092d514e"]]
   o  dd800401bd8c
   |
   o  f897c6137566
@@ -1087,13 +1165,19 @@ 
   |      semi-colon: 4:9bd10a0775e4
   |      json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
   |      map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
+  |      Successors: 8:b18bc8331526; 9:0b997eb7ceee
+  |      multi-line: 8:b18bc8331526
+  |      multi-line: 9:0b997eb7ceee
+  |      json: [["b18bc8331526a22cbb1801022bd1555bf291c48b"], ["0b997eb7ceeee06200a02f8aab185979092d514e"]]
   o  dd800401bd8c
   |    Predecessors: 4:9bd10a0775e4
   |    semi-colon: 4:9bd10a0775e4
   |    json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
   |    map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
   | x  9bd10a0775e4
-  |/
+  |/     Successors: 5:dd800401bd8c 6:4a004186e638 7:ba2ed02b0c9a
+  |      multi-line: 5:dd800401bd8c 6:4a004186e638 7:ba2ed02b0c9a
+  |      json: [["dd800401bd8c79d815329277739e433e883f784e", "4a004186e63889f20cb16434fcbd72220bd1eace", "ba2ed02b0c9a56b9fdbc4e79c7e57866984d8a1f"]]
   o  f897c6137566
   |    Predecessors: 2:0dec01379d3b
   |    semi-colon: 2:0dec01379d3b
@@ -1104,11 +1188,18 @@ 
   | |    semi-colon: 1:471f378eab4c
   | |    json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
   | |    map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
+  | |    Successors: 3:f897c6137566; 1:471f378eab4c
+  | |    multi-line: 3:f897c6137566
+  | |    multi-line: 1:471f378eab4c
+  | |    json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
   | x  471f378eab4c
   |/     Predecessors: 2:0dec01379d3b
   |      semi-colon: 2:0dec01379d3b
   |      json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
   |      map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
+  |      Successors: 2:0dec01379d3b
+  |      multi-line: 2:0dec01379d3b
+  |      json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
   o  ea207398892e
   
   $ hg up --hidden 4
@@ -1137,7 +1228,10 @@ 
   |    json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
   |    map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
   | @  9bd10a0775e4
-  |/
+  |/     Successors: 5:dd800401bd8c 9:0b997eb7ceee 10:eceed8f98ffc; 5:dd800401bd8c 8:b18bc8331526 10:eceed8f98ffc
+  |      multi-line: 5:dd800401bd8c 9:0b997eb7ceee 10:eceed8f98ffc
+  |      multi-line: 5:dd800401bd8c 8:b18bc8331526 10:eceed8f98ffc
+  |      json: [["dd800401bd8c79d815329277739e433e883f784e", "0b997eb7ceeee06200a02f8aab185979092d514e", "eceed8f98ffc4186032e29a6542ab98888ebf68d"], ["dd800401bd8c79d815329277739e433e883f784e", "b18bc8331526a22cbb1801022bd1555bf291c48b", "eceed8f98ffc4186032e29a6542ab98888ebf68d"]]
   o  f897c6137566
   |
   o  ea207398892e