Patchwork [4,of,4,V2] graphmod: end edges to missing parents early

login
register
mail settings
Submitter Martijn Pieters
Date March 4, 2016, 8:47 p.m.
Message ID <32e17d0d7f5da8e3ecfb.1457124426@mjpieters-mbp>
Download mbox | patch
Permalink /patch/13612/
State Changes Requested
Headers show

Comments

Martijn Pieters - March 4, 2016, 8:47 p.m.
# HG changeset patch
# User Martijn Pieters <mjpieters@fb.com>
# Date 1457119575 0
#      Fri Mar 04 19:26:15 2016 +0000
# Node ID 32e17d0d7f5da8e3ecfb8ff19b881104dcbc935b
# Parent  794d4e68aa4fcfc2da23bfd71ba1294eb82e37c3
graphmod: end edges to missing parents early.

Rather than draw an edge all the way to the bottom of the graph, end an edge to
parents that are not part of the graph early on. This results in a far cleaner
graph.
Sean Farley - March 4, 2016, 10:41 p.m.
Martijn Pieters <mj@zopatista.com> writes:

> # HG changeset patch
> # User Martijn Pieters <mjpieters@fb.com>
> # Date 1457119575 0
> #      Fri Mar 04 19:26:15 2016 +0000
> # Node ID 32e17d0d7f5da8e3ecfb8ff19b881104dcbc935b
> # Parent  794d4e68aa4fcfc2da23bfd71ba1294eb82e37c3
> graphmod: end edges to missing parents early.
>
> Rather than draw an edge all the way to the bottom of the graph, end an edge to
> parents that are not part of the graph early on. This results in a far cleaner
> graph.

I like these, though, mostly because of the pretty pictures :-)
Martijn Pieters - March 5, 2016, 3:02 p.m.
On 4 March 2016 at 20:47, Martijn Pieters <mj@zopatista.com> wrote:
> +  o | |  changeset:   18:1aa84d96232a
> +  |\| |  parent:      1:6db2ef61d156
> +  ~ | |  parent:      15:1dda3f72782d
> +    | |  user:        test
> +    | |  date:        Thu Jan 01 00:00:18 1970 +0000
> +   / /     summary:     (18) merge two known; two far left
> +   / /
> +  | o    changeset:   17:44765d7c06e0

Unfortunately, I missed a bug in my approach here; the above has one
line too many, and the `summary` text is indented too far.

I've also identified incorrect handling when there are two or more
missing-parent edges connected to a node here. I'll have to rethink
this part some more.
Pierre-Yves David - March 7, 2016, 4:28 p.m.
On 03/05/2016 04:02 PM, Martijn Pieters wrote:
> On 4 March 2016 at 20:47, Martijn Pieters <mj@zopatista.com> wrote:
>> +  o | |  changeset:   18:1aa84d96232a
>> +  |\| |  parent:      1:6db2ef61d156
>> +  ~ | |  parent:      15:1dda3f72782d
>> +    | |  user:        test
>> +    | |  date:        Thu Jan 01 00:00:18 1970 +0000
>> +   / /     summary:     (18) merge two known; two far left
>> +   / /
>> +  | o    changeset:   17:44765d7c06e0
>
> Unfortunately, I missed a bug in my approach here; the above has one
> line too many, and the `summary` text is indented too far.
>
> I've also identified incorrect handling when there are two or more
> missing-parent edges connected to a node here. I'll have to rethink
> this part some more.

This apply to patch 4 right?
The patches 1 to 3 are still relevant, right?

Cheers,
Martijn Pieters - March 7, 2016, 4:43 p.m.
On 7 Mar 2016, at 16:28, Pierre-Yves David <pierre-yves.david@ens-lyon.org> wrote:
> This apply to patch 4 right?
> The patches 1 to 3 are still relevant, right?

Yes, this only affects patch 4. The other 3 are good to go.

--
Martijn Pieters

Patch

diff --git a/mercurial/graphmod.py b/mercurial/graphmod.py
--- a/mercurial/graphmod.py
+++ b/mercurial/graphmod.py
@@ -31,7 +31,9 @@ 
 PARENT = 'P'
 GRANDPARENT = 'G'
 MISSINGPARENT = 'M'
-EDGES = {PARENT: '|', GRANDPARENT: ':', MISSINGPARENT: '.'}
+# Style of line to draw. None signals a line that ends and is removed at this
+# point.
+EDGES = {PARENT: '|', GRANDPARENT: ':', MISSINGPARENT: None}
 
 def groupbranchiter(revs, parentsfunc, firstbranch=()):
     """Yield revisions from heads to roots one (topo) branch at a time.
@@ -483,6 +485,47 @@ 
         line.extend(echars[-(remainder * 2):])
     return line
 
+def _drawendinglines(lines, extra, edgemap, seen):
+    """Draw ending lines for missing parent edges
+
+    None indicates an edge that ends at between this node and the next
+    Replace with a short line ending in ~ and add / lines to any edges to
+    the right.
+
+    """
+    if None not in edgemap.values():
+        return
+
+    # Check for more edges to the right of our ending edge.
+    # We need enough space to draw adjustment lines for these.
+    shift_size = sum(c is not None
+                     for c in extra[extra.index(None) + 2::2])
+    while len(lines) < 3 + shift_size:
+        lines.append(extra[:])
+
+    for i in range(len(lines) - shift_size, len(lines)):
+        line = lines[i]
+        while None in line:
+            index = line.index(None)
+            line[index:index + 2] = []
+            line[index:] = ['/' if c == ' ' else ' ' for c in line[index:]]
+            line.extend('  ' * shift_size)
+        # copy to the next to ensure a smooth joining line.
+        if i < len(lines) - 1:
+            lines[i + 1] = line[:]
+
+    map = {1: '|', 2: '~'}
+    for i, line in enumerate(lines):
+        if None not in line:
+            continue
+        line[:] = [c or map.get(i, ' ') for c in line]
+
+    # remove edges that ended
+    remove = [p for p, c in edgemap.items() if c is None]
+    for parent in remove:
+        del edgemap[parent]
+        seen.remove(parent)
+
 def asciistate():
     """returns the initial value for the "state" argument to ascii()"""
     return {'seen': [], 'edges': {}, 'lastcoldiff': 0, 'lastindex': 0}
@@ -576,12 +619,15 @@ 
 
     # make sure that there are as many graph lines as there are
     # log strings
+    extra_interline = echars[:(ncols + coldiff) * 2]
+    if len(lines) < len(text):
+        while len(lines) < len(text):
+            lines.append(extra_interline[:])
+
+    _drawendinglines(lines, extra_interline, edgemap, seen)
+
     while len(text) < len(lines):
         text.append("")
-    if len(lines) < len(text):
-        extra_interline = echars[:(ncols + coldiff) * 2]
-        while len(lines) < len(text):
-            lines.append(extra_interline)
 
     # print lines
     indentation_level = max(ncols, ncols + coldiff)
diff --git a/tests/test-commit-amend.t b/tests/test-commit-amend.t
--- a/tests/test-commit-amend.t
+++ b/tests/test-commit-amend.t
@@ -539,11 +539,11 @@ 
   |    babar
   |
   | o  12:0   2647734878ef   1970-01-01 00:00 +0000   test
-  | .    fork
-  | .
-  o .  11   3334b7925910   1970-01-01 00:00 +0000   test
-  . .    a''
-  . .
+  | |    fork
+  | ~
+  o  11   3334b7925910   1970-01-01 00:00 +0000   test
+  |    a''
+  ~
   $ hg log -Gl 4 --hidden --style=compact
   @  14[tip]:11   b650e6ee8614   1970-01-01 00:00 +0000   test
   |    babar
@@ -552,11 +552,11 @@ 
   |/     amend for phase
   |
   | o  12:0   2647734878ef   1970-01-01 00:00 +0000   test
-  | .    fork
-  | .
-  o .  11   3334b7925910   1970-01-01 00:00 +0000   test
-  . .    a''
-  . .
+  | |    fork
+  | ~
+  o  11   3334b7925910   1970-01-01 00:00 +0000   test
+  |    a''
+  ~
 
 Amend with files changes
 
@@ -579,11 +579,11 @@ 
   |/     amend for phase
   |
   | o  12:0   2647734878ef   1970-01-01 00:00 +0000   test
-  | .    fork
-  | .
-  o .  11   3334b7925910   1970-01-01 00:00 +0000   test
-  . .    a''
-  . .
+  | |    fork
+  | ~
+  o  11   3334b7925910   1970-01-01 00:00 +0000   test
+  |    a''
+  ~
 
 
 Test that amend does not make it easy to create obsolescence cycle
diff --git a/tests/test-convert-hg-sink.t b/tests/test-convert-hg-sink.t
--- a/tests/test-convert-hg-sink.t
+++ b/tests/test-convert-hg-sink.t
@@ -370,7 +370,8 @@ 
   | o  7 e6d364a69ff1 (draft) "change in dest" files: dest
   |/
   o  6 0613c8e59a3d (public) "6: change a" files: a
-  .
+  |
+  ~
   $ cd ..
 
   $ hg convert --filemap filemap source dest --config convert.hg.revs=3:
diff --git a/tests/test-glog.t b/tests/test-glog.t
--- a/tests/test-glog.t
+++ b/tests/test-glog.t
@@ -954,179 +954,180 @@ 
   | :
   o :    changeset:   30:6e11cd4b648f
   |\ \   parent:      28:44ecd0b9ae99
-  | . :  parent:      29:cd9bb2be7593
-  | . :  user:        test
-  | . :  date:        Thu Jan 01 00:00:30 1970 +0000
-  | . :  summary:     (30) expand
-  | . :
-  o . :    changeset:   28:44ecd0b9ae99
-  |\ \ \   parent:      1:6db2ef61d156
-  | . . :  parent:      26:7f25b6c2f0b9
-  | . . :  user:        test
-  | . . :  date:        Thu Jan 01 00:00:28 1970 +0000
-  | . . :  summary:     (28) merge zero known
-  | . . :
-  o . . :    changeset:   26:7f25b6c2f0b9
-  |\ \ \ \   parent:      18:1aa84d96232a
-  | | . . :  parent:      25:91da8ed57247
-  | | . . :  user:        test
-  | | . . :  date:        Thu Jan 01 00:00:26 1970 +0000
-  | | . . :  summary:     (26) merge one known; far right
-  | | . . :
-  | o-----+  changeset:   25:91da8ed57247
-  | | . . :  parent:      21:d42a756af44d
-  | | . . :  parent:      24:a9c19a3d96b7
-  | | . . :  user:        test
-  | | . . :  date:        Thu Jan 01 00:00:25 1970 +0000
-  | | . . :  summary:     (25) merge one known; far left
-  | | . . :
-  | o . . :    changeset:   24:a9c19a3d96b7
-  | |\ \ \ \   parent:      0:e6eb3150255d
-  | | . . . :  parent:      23:a01cddf0766d
-  | | . . . :  user:        test
-  | | . . . :  date:        Thu Jan 01 00:00:24 1970 +0000
-  | | . . . :  summary:     (24) merge one known; immediate right
-  | | . . . :
-  | o---+ . :  changeset:   23:a01cddf0766d
-  | | . . . :  parent:      1:6db2ef61d156
-  | | . . . :  parent:      22:e0d9cccacb5d
-  | | . . . :  user:        test
-  | | . . . :  date:        Thu Jan 01 00:00:23 1970 +0000
-  | | . . . :  summary:     (23) merge one known; immediate left
-  | | . . . :
-  | o-------+  changeset:   22:e0d9cccacb5d
-  | . . . . :  parent:      18:1aa84d96232a
-  |/ / / / /   parent:      21:d42a756af44d
-  | . . . :    user:        test
-  | . . . :    date:        Thu Jan 01 00:00:22 1970 +0000
-  | . . . :    summary:     (22) merge two known; one far left, one far right
-  | . . . :
-  | . . . o    changeset:   21:d42a756af44d
-  | . . . |\   parent:      19:31ddc2c1573b
-  | . . . | |  parent:      20:d30ed6450e32
-  | . . . | |  user:        test
-  | . . . | |  date:        Thu Jan 01 00:00:21 1970 +0000
-  | . . . | |  summary:     (21) expand
-  | . . . | |
-  +-+-------o  changeset:   20:d30ed6450e32
-  | . . . |    parent:      0:e6eb3150255d
-  | . . . |    parent:      18:1aa84d96232a
-  | . . . |    user:        test
-  | . . . |    date:        Thu Jan 01 00:00:20 1970 +0000
-  | . . . |    summary:     (20) merge two known; two far right
-  | . . . |
-  | . . . o    changeset:   19:31ddc2c1573b
-  | . . . |\   parent:      15:1dda3f72782d
-  | . . . | |  parent:      17:44765d7c06e0
-  | . . . | |  user:        test
-  | . . . | |  date:        Thu Jan 01 00:00:19 1970 +0000
-  | . . . | |  summary:     (19) expand
-  | . . . | |
-  o---+---+ |  changeset:   18:1aa84d96232a
-    . . . | |  parent:      1:6db2ef61d156
-   / / / / /   parent:      15:1dda3f72782d
-  . . . | |    user:        test
-  . . . | |    date:        Thu Jan 01 00:00:18 1970 +0000
-  . . . | |    summary:     (18) merge two known; two far left
-  . . . | |
-  . . . | o    changeset:   17:44765d7c06e0
-  . . . | |\   parent:      12:86b91144a6e9
-  . . . | | |  parent:      16:3677d192927d
-  . . . | | |  user:        test
-  . . . | | |  date:        Thu Jan 01 00:00:17 1970 +0000
-  . . . | | |  summary:     (17) expand
-  . . . | | |
-  +-+-------o  changeset:   16:3677d192927d
-  . . . | |    parent:      0:e6eb3150255d
-  . . . | |    parent:      1:6db2ef61d156
-  . . . | |    user:        test
-  . . . | |    date:        Thu Jan 01 00:00:16 1970 +0000
-  . . . | |    summary:     (16) merge two known; one immediate right, one near right
-  . . . | |
-  . . . o |    changeset:   15:1dda3f72782d
-  . . . |\ \   parent:      13:22d8966a97e3
-  . . . | | |  parent:      14:8eac370358ef
-  . . . | | |  user:        test
-  . . . | | |  date:        Thu Jan 01 00:00:15 1970 +0000
-  . . . | | |  summary:     (15) expand
-  . . . | | |
-  +-------o |  changeset:   14:8eac370358ef
-  . . . | |/   parent:      0:e6eb3150255d
-  . . . | |    parent:      12:86b91144a6e9
-  . . . | |    user:        test
-  . . . | |    date:        Thu Jan 01 00:00:14 1970 +0000
-  . . . | |    summary:     (14) merge two known; one immediate right, one far right
-  . . . | |
-  . . . o |    changeset:   13:22d8966a97e3
-  . . . |\ \   parent:      9:7010c0af0a35
-  . . . | | |  parent:      11:832d76e6bdf2
-  . . . | | |  user:        test
-  . . . | | |  date:        Thu Jan 01 00:00:13 1970 +0000
-  . . . | | |  summary:     (13) expand
-  . . . | | |
-  . +---+---o  changeset:   12:86b91144a6e9
-  . . . | |    parent:      1:6db2ef61d156
-  . . . | |    parent:      9:7010c0af0a35
-  . . . | |    user:        test
-  . . . | |    date:        Thu Jan 01 00:00:12 1970 +0000
-  . . . | |    summary:     (12) merge two known; one immediate right, one far left
-  . . . | |
-  . . . | o    changeset:   11:832d76e6bdf2
-  . . . | |\   parent:      6:b105a072e251
-  . . . | | |  parent:      10:74c64d036d72
-  . . . | | |  user:        test
-  . . . | | |  date:        Thu Jan 01 00:00:11 1970 +0000
-  . . . | | |  summary:     (11) expand
-  . . . | | |
-  +---------o  changeset:   10:74c64d036d72
-  . . . | |/   parent:      0:e6eb3150255d
-  . . . | |    parent:      6:b105a072e251
-  . . . | |    user:        test
-  . . . | |    date:        Thu Jan 01 00:00:10 1970 +0000
-  . . . | |    summary:     (10) merge two known; one immediate left, one near right
-  . . . | |
-  . . . o |    changeset:   9:7010c0af0a35
-  . . . |\ \   parent:      7:b632bb1b1224
-  . . . | | |  parent:      8:7a0b11f71937
-  . . . | | |  user:        test
-  . . . | | |  date:        Thu Jan 01 00:00:09 1970 +0000
-  . . . | | |  summary:     (9) expand
-  . . . | | |
-  +-------o |  changeset:   8:7a0b11f71937
-  . . . |/ /   parent:      0:e6eb3150255d
-  . . . | |    parent:      7:b632bb1b1224
-  . . . | |    user:        test
-  . . . | |    date:        Thu Jan 01 00:00:08 1970 +0000
-  . . . | |    summary:     (8) merge two known; one immediate left, one far right
-  . . . | |
-  . . . o |    changeset:   7:b632bb1b1224
-  . . . |\ \   parent:      2:3d9a33b8d1e1
-  . . . | . |  parent:      5:4409d547b708
-  . . . | . |  user:        test
-  . . . | . |  date:        Thu Jan 01 00:00:07 1970 +0000
-  . . . | . |  summary:     (7) expand
-  . . . | . |
-  . . . +---o  changeset:   6:b105a072e251
-  . . . | ./   parent:      2:3d9a33b8d1e1
-  . . . | .    parent:      5:4409d547b708
-  . . . | .    user:        test
-  . . . | .    date:        Thu Jan 01 00:00:06 1970 +0000
-  . . . | .    summary:     (6) merge two known; one immediate left, one far left
-  . . . | .
-  . . . o .    changeset:   5:4409d547b708
-  . . . |\ \   parent:      3:27eef8ed80b4
-  . . . | . .  parent:      4:26a8bac39d9f
-  . . . | . .  user:        test
-  . . . | . .  date:        Thu Jan 01 00:00:05 1970 +0000
-  . . . | . .  summary:     (5) expand
-  . . . | . .
-  . +---o . .  changeset:   4:26a8bac39d9f
-  . . . ./ /   parent:      1:6db2ef61d156
-  . . . . .    parent:      3:27eef8ed80b4
-  . . . . .    user:        test
-  . . . . .    date:        Thu Jan 01 00:00:04 1970 +0000
-  . . . . .    summary:     (4) merge two known; one immediate left, one immediate right
-  . . . . .
+  | ~ :  parent:      29:cd9bb2be7593
+  |   :  user:        test
+  |   :  date:        Thu Jan 01 00:00:30 1970 +0000
+  |   :  summary:     (30) expand
+  |  /
+  o :    changeset:   28:44ecd0b9ae99
+  |\ \   parent:      1:6db2ef61d156
+  | ~ :  parent:      26:7f25b6c2f0b9
+  |   :  user:        test
+  |   :  date:        Thu Jan 01 00:00:28 1970 +0000
+  |   :  summary:     (28) merge zero known
+  |  /
+  o :    changeset:   26:7f25b6c2f0b9
+  |\ \   parent:      18:1aa84d96232a
+  | | :  parent:      25:91da8ed57247
+  | | :  user:        test
+  | | :  date:        Thu Jan 01 00:00:26 1970 +0000
+  | | :  summary:     (26) merge one known; far right
+  | | :
+  | o :  changeset:   25:91da8ed57247
+  | |\:  parent:      21:d42a756af44d
+  | | :  parent:      24:a9c19a3d96b7
+  | | :  user:        test
+  | | :  date:        Thu Jan 01 00:00:25 1970 +0000
+  | | :  summary:     (25) merge one known; far left
+  | | :
+  | o :    changeset:   24:a9c19a3d96b7
+  | |\ \   parent:      0:e6eb3150255d
+  | | ~ :  parent:      23:a01cddf0766d
+  | |   :  user:        test
+  | |   :  date:        Thu Jan 01 00:00:24 1970 +0000
+  | |   :  summary:     (24) merge one known; immediate right
+  | |  /
+  | o :    changeset:   23:a01cddf0766d
+  | |\ \   parent:      1:6db2ef61d156
+  | | ~ :  parent:      22:e0d9cccacb5d
+  | |   :  user:        test
+  | |   :  date:        Thu Jan 01 00:00:23 1970 +0000
+  | |   :  summary:     (23) merge one known; immediate left
+  | |  /
+  | o :  changeset:   22:e0d9cccacb5d
+  |/:/   parent:      18:1aa84d96232a
+  | :    parent:      21:d42a756af44d
+  | :    user:        test
+  | :    date:        Thu Jan 01 00:00:22 1970 +0000
+  | :    summary:     (22) merge two known; one far left, one far right
+  | :
+  | o    changeset:   21:d42a756af44d
+  | |\   parent:      19:31ddc2c1573b
+  | | |  parent:      20:d30ed6450e32
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:21 1970 +0000
+  | | |  summary:     (21) expand
+  | | |
+  +---o  changeset:   20:d30ed6450e32
+  | | |  parent:      0:e6eb3150255d
+  | | ~  parent:      18:1aa84d96232a
+  | |    user:        test
+  | |    date:        Thu Jan 01 00:00:20 1970 +0000
+  | |    summary:     (20) merge two known; two far right
+  | |
+  | o    changeset:   19:31ddc2c1573b
+  | |\   parent:      15:1dda3f72782d
+  | | |  parent:      17:44765d7c06e0
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:19 1970 +0000
+  | | |  summary:     (19) expand
+  | | |
+  o | |  changeset:   18:1aa84d96232a
+  |\| |  parent:      1:6db2ef61d156
+  ~ | |  parent:      15:1dda3f72782d
+    | |  user:        test
+    | |  date:        Thu Jan 01 00:00:18 1970 +0000
+   / /     summary:     (18) merge two known; two far left
+   / /
+  | o    changeset:   17:44765d7c06e0
+  | |\   parent:      12:86b91144a6e9
+  | | |  parent:      16:3677d192927d
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:17 1970 +0000
+  | | |  summary:     (17) expand
+  | | |
+  | | o    changeset:   16:3677d192927d
+  | | |\   parent:      0:e6eb3150255d
+  | | ~ ~  parent:      1:6db2ef61d156
+  | |      user:        test
+  | |      date:        Thu Jan 01 00:00:16 1970 +0000
+  | |      summary:     (16) merge two known; one immediate right, one near right
+  | |
+  o |    changeset:   15:1dda3f72782d
+  |\ \   parent:      13:22d8966a97e3
+  | | |  parent:      14:8eac370358ef
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:15 1970 +0000
+  | | |  summary:     (15) expand
+  | | |
+  | o |  changeset:   14:8eac370358ef
+  | |\|  parent:      0:e6eb3150255d
+  | ~ |  parent:      12:86b91144a6e9
+  |   |  user:        test
+  |   |  date:        Thu Jan 01 00:00:14 1970 +0000
+  |   |  summary:     (14) merge two known; one immediate right, one far right
+  |  /
+  o |    changeset:   13:22d8966a97e3
+  |\ \   parent:      9:7010c0af0a35
+  | | |  parent:      11:832d76e6bdf2
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:13 1970 +0000
+  | | |  summary:     (13) expand
+  | | |
+  +---o  changeset:   12:86b91144a6e9
+  | | |  parent:      1:6db2ef61d156
+  | | ~  parent:      9:7010c0af0a35
+  | |    user:        test
+  | |    date:        Thu Jan 01 00:00:12 1970 +0000
+  | |    summary:     (12) merge two known; one immediate right, one far left
+  | |
+  | o    changeset:   11:832d76e6bdf2
+  | |\   parent:      6:b105a072e251
+  | | |  parent:      10:74c64d036d72
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:11 1970 +0000
+  | | |  summary:     (11) expand
+  | | |
+  | | o  changeset:   10:74c64d036d72
+  | |/|  parent:      0:e6eb3150255d
+  | | ~  parent:      6:b105a072e251
+  | |    user:        test
+  | |    date:        Thu Jan 01 00:00:10 1970 +0000
+  | |    summary:     (10) merge two known; one immediate left, one near right
+  | |
+  o |    changeset:   9:7010c0af0a35
+  |\ \   parent:      7:b632bb1b1224
+  | | |  parent:      8:7a0b11f71937
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:09 1970 +0000
+  | | |  summary:     (9) expand
+  | | |
+  | o |  changeset:   8:7a0b11f71937
+  |/| |  parent:      0:e6eb3150255d
+  | ~ |  parent:      7:b632bb1b1224
+  |   |  user:        test
+  |   |  date:        Thu Jan 01 00:00:08 1970 +0000
+  |   |  summary:     (8) merge two known; one immediate left, one far right
+  |  /
+  o |    changeset:   7:b632bb1b1224
+  |\ \   parent:      2:3d9a33b8d1e1
+  | ~ |  parent:      5:4409d547b708
+  |   |  user:        test
+  |   |  date:        Thu Jan 01 00:00:07 1970 +0000
+  |   |  summary:     (7) expand
+  |  /
+  | o  changeset:   6:b105a072e251
+  |/|  parent:      2:3d9a33b8d1e1
+  | ~  parent:      5:4409d547b708
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:06 1970 +0000
+  |    summary:     (6) merge two known; one immediate left, one far left
+  |
+  o    changeset:   5:4409d547b708
+  |\   parent:      3:27eef8ed80b4
+  | ~  parent:      4:26a8bac39d9f
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:05 1970 +0000
+  |    summary:     (5) expand
+  |
+  o    changeset:   4:26a8bac39d9f
+  |\   parent:      1:6db2ef61d156
+  ~ ~  parent:      3:27eef8ed80b4
+       user:        test
+       date:        Thu Jan 01 00:00:04 1970 +0000
+       summary:     (4) merge two known; one immediate left, one immediate right
+  
+
 
 
 Empty revision range - display nothing:
@@ -1139,20 +1140,22 @@ 
 From outer space:
   $ hg log -G -l1 repo
   @  changeset:   34:fea3ac5810e0
-  .  tag:         tip
-  .  parent:      32:d06dffa21a31
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:34 1970 +0000
-  .  summary:     (34) head
-  .
+  |  tag:         tip
+  ~  parent:      32:d06dffa21a31
+     user:        test
+     date:        Thu Jan 01 00:00:34 1970 +0000
+     summary:     (34) head
+  
+
   $ hg log -G -l1 repo/a
   @  changeset:   34:fea3ac5810e0
-  .  tag:         tip
-  .  parent:      32:d06dffa21a31
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:34 1970 +0000
-  .  summary:     (34) head
-  .
+  |  tag:         tip
+  ~  parent:      32:d06dffa21a31
+     user:        test
+     date:        Thu Jan 01 00:00:34 1970 +0000
+     summary:     (34) head
+  
+
   $ hg log -G -l1 repo/missing
 
 #endif
@@ -1176,10 +1179,11 @@ 
   |  summary:     more
   |
   o  changeset:   1:5ac72c0599bf
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:00 1970 +0000
-  .  summary:     two
-  .
+  |  user:        test
+  ~  date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     two
+  
+
 
 Issue1896: File log with explicit style
   $ hg log -G --style=default one
@@ -1188,6 +1192,7 @@ 
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     one
   
+
 Issue2395: glog --style header and footer
   $ hg log -G --style=xml one
   <?xml version="1.0"?>
@@ -1277,17 +1282,17 @@ 
   $ hg ci -Aqm0
   $ hg log -G -l2 a
   o  changeset:   34:fea3ac5810e0
-  .  parent:      32:d06dffa21a31
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:34 1970 +0000
-  .  summary:     (34) head
-  .
-  . o  changeset:   33:68608f5145f9
-  . .  parent:      18:1aa84d96232a
-  . .  user:        test
-  . .  date:        Thu Jan 01 00:00:33 1970 +0000
-  . .  summary:     (33) head
-  . .
+  |  parent:      32:d06dffa21a31
+  ~  user:        test
+     date:        Thu Jan 01 00:00:34 1970 +0000
+     summary:     (34) head
+  
+  o  changeset:   33:68608f5145f9
+  |  parent:      18:1aa84d96232a
+  ~  user:        test
+     date:        Thu Jan 01 00:00:33 1970 +0000
+     summary:     (33) head
+  
 
 File + limit + -ra:b, (b - a) < limit:
   $ hg log -G -l3000 -r32:tip a
@@ -1298,67 +1303,67 @@ 
   |  summary:     (34) head
   |
   | o  changeset:   33:68608f5145f9
-  | .  parent:      18:1aa84d96232a
-  | .  user:        test
-  | .  date:        Thu Jan 01 00:00:33 1970 +0000
-  | .  summary:     (33) head
-  | .
-  o .    changeset:   32:d06dffa21a31
-  .\ \   parent:      27:886ed638191b
-  . . .  parent:      31:621d83e11f67
-  . . .  user:        test
-  . . .  date:        Thu Jan 01 00:00:32 1970 +0000
-  . . .  summary:     (32) expand
-  . . .
+  | |  parent:      18:1aa84d96232a
+  | ~  user:        test
+  |    date:        Thu Jan 01 00:00:33 1970 +0000
+  |    summary:     (33) head
+  |
+  o    changeset:   32:d06dffa21a31
+  |\   parent:      27:886ed638191b
+  ~ ~  parent:      31:621d83e11f67
+       user:        test
+       date:        Thu Jan 01 00:00:32 1970 +0000
+       summary:     (32) expand
+  
 
 Point out a common and an uncommon unshown parent
 
   $ hg log -G -r 'rev(8) or rev(9)'
   o    changeset:   9:7010c0af0a35
   |\   parent:      7:b632bb1b1224
-  | .  parent:      8:7a0b11f71937
-  | .  user:        test
-  | .  date:        Thu Jan 01 00:00:09 1970 +0000
-  | .  summary:     (9) expand
-  | .
-  o .  changeset:   8:7a0b11f71937
-  .\.  parent:      0:e6eb3150255d
-  . .  parent:      7:b632bb1b1224
-  . .  user:        test
-  . .  date:        Thu Jan 01 00:00:08 1970 +0000
-  . .  summary:     (8) merge two known; one immediate left, one far right
-  . .
+  | ~  parent:      8:7a0b11f71937
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:09 1970 +0000
+  |    summary:     (9) expand
+  |
+  o    changeset:   8:7a0b11f71937
+  |\   parent:      0:e6eb3150255d
+  ~ ~  parent:      7:b632bb1b1224
+       user:        test
+       date:        Thu Jan 01 00:00:08 1970 +0000
+       summary:     (8) merge two known; one immediate left, one far right
+  
 
 File + limit + -ra:b, b < tip:
 
   $ hg log -G -l1 -r32:34 a
   o  changeset:   34:fea3ac5810e0
-  .  parent:      32:d06dffa21a31
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:34 1970 +0000
-  .  summary:     (34) head
-  .
+  |  parent:      32:d06dffa21a31
+  ~  user:        test
+     date:        Thu Jan 01 00:00:34 1970 +0000
+     summary:     (34) head
+  
 
 file(File) + limit + -ra:b, b < tip:
 
   $ hg log -G -l1 -r32:34 -r 'file("a")'
   o  changeset:   34:fea3ac5810e0
-  .  parent:      32:d06dffa21a31
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:34 1970 +0000
-  .  summary:     (34) head
-  .
+  |  parent:      32:d06dffa21a31
+  ~  user:        test
+     date:        Thu Jan 01 00:00:34 1970 +0000
+     summary:     (34) head
+  
 
 limit(file(File) and a::b), b < tip:
 
   $ hg log -G -r 'limit(file("a") and 32::34, 1)'
   o    changeset:   32:d06dffa21a31
-  .\   parent:      27:886ed638191b
-  . .  parent:      31:621d83e11f67
-  . .  user:        test
-  . .  date:        Thu Jan 01 00:00:32 1970 +0000
-  . .  summary:     (32) expand
-  . .
+  |\   parent:      27:886ed638191b
+  ~ ~  parent:      31:621d83e11f67
+       user:        test
+       date:        Thu Jan 01 00:00:32 1970 +0000
+       summary:     (32) expand
+  
 
 File + limit + -ra:b, b < tip:
 
@@ -1368,17 +1373,17 @@ 
 
   $ hg log -G -l10 -r33:34 a
   o  changeset:   34:fea3ac5810e0
-  .  parent:      32:d06dffa21a31
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:34 1970 +0000
-  .  summary:     (34) head
-  .
-  . o  changeset:   33:68608f5145f9
-  . .  parent:      18:1aa84d96232a
-  . .  user:        test
-  . .  date:        Thu Jan 01 00:00:33 1970 +0000
-  . .  summary:     (33) head
-  . .
+  |  parent:      32:d06dffa21a31
+  ~  user:        test
+     date:        Thu Jan 01 00:00:34 1970 +0000
+     summary:     (34) head
+  
+  o  changeset:   33:68608f5145f9
+  |  parent:      18:1aa84d96232a
+  ~  user:        test
+     date:        Thu Jan 01 00:00:33 1970 +0000
+     summary:     (33) head
+  
 
 Do not crash or produce strange graphs if history is buggy
 
@@ -1408,18 +1413,18 @@ 
   |  summary:     (34) head
   |
   | o  changeset:   33:68608f5145f9
-  | .  parent:      18:1aa84d96232a
-  | .  user:        test
-  | .  date:        Thu Jan 01 00:00:33 1970 +0000
-  | .  summary:     (33) head
-  | .
-  o .    changeset:   32:d06dffa21a31
-  .\ \   parent:      27:886ed638191b
-  . . .  parent:      31:621d83e11f67
-  . . .  user:        test
-  . . .  date:        Thu Jan 01 00:00:32 1970 +0000
-  . . .  summary:     (32) expand
-  . . .
+  | |  parent:      18:1aa84d96232a
+  | ~  user:        test
+  |    date:        Thu Jan 01 00:00:33 1970 +0000
+  |    summary:     (33) head
+  |
+  o    changeset:   32:d06dffa21a31
+  |\   parent:      27:886ed638191b
+  ~ ~  parent:      31:621d83e11f67
+       user:        test
+       date:        Thu Jan 01 00:00:32 1970 +0000
+       summary:     (32) expand
+  
 
 Test log -G options
 
@@ -1796,8 +1801,10 @@ 
   $ hg log -G --follow-first e --template '{rev} {desc|firstline}\n'
   @    6 merge 5 and 4
   |\
-  o .  5 add another e
-  . .
+  | ~
+  o  5 add another e
+  |
+  ~
 
 Test --copies
 
@@ -1875,24 +1882,24 @@ 
   $ hg up -q 3
   $ hg log -G --git --patch b
   o  changeset:   1:216d4c92cf98
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:00 1970 +0000
-  .  summary:     copy a b
-  .
-  .  diff --git a/a b/b
-  .  copy from a
-  .  copy to b
-  .
+  |  user:        test
+  ~  date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     copy a b
+  
+     diff --git a/a b/b
+     copy from a
+     copy to b
+  
 
   $ hg log -G --git --stat b
   o  changeset:   1:216d4c92cf98
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:00 1970 +0000
-  .  summary:     copy a b
-  .
-  .   b |  0
-  .   1 files changed, 0 insertions(+), 0 deletions(-)
-  .
+  |  user:        test
+  ~  date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     copy a b
+  
+      b |  0
+      1 files changed, 0 insertions(+), 0 deletions(-)
+  
 
   $ hg log -G --git --patch --follow b
   o  changeset:   1:216d4c92cf98
@@ -1939,32 +1946,32 @@ 
   $ hg log -G --git --patch --follow-first e
   @    changeset:   6:fc281d8ff18d
   |\   tag:         tip
-  | .  parent:      5:99b31f1c2782
-  | .  parent:      4:17d952250a9d
-  | .  user:        test
-  | .  date:        Thu Jan 01 00:00:00 1970 +0000
-  | .  summary:     merge 5 and 4
-  | .
-  | .  diff --git a/e b/e
-  | .  --- a/e
-  | .  +++ b/e
-  | .  @@ -1,1 +1,1 @@
-  | .  -ee
-  | .  +merge
-  | .
-  o .  changeset:   5:99b31f1c2782
-  . .  parent:      3:5918b8d165d1
-  . .  user:        test
-  . .  date:        Thu Jan 01 00:00:00 1970 +0000
-  . .  summary:     add another e
-  . .
-  . .  diff --git a/e b/e
-  . .  new file mode 100644
-  . .  --- /dev/null
-  . .  +++ b/e
-  . .  @@ -0,0 +1,1 @@
-  . .  +ee
-  . .
+  | ~  parent:      5:99b31f1c2782
+  |    parent:      4:17d952250a9d
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     merge 5 and 4
+  |
+  |    diff --git a/e b/e
+  |    --- a/e
+  |    +++ b/e
+  |    @@ -1,1 +1,1 @@
+  |    -ee
+  |    +merge
+  |
+  o  changeset:   5:99b31f1c2782
+  |  parent:      3:5918b8d165d1
+  ~  user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add another e
+  
+     diff --git a/e b/e
+     new file mode 100644
+     --- /dev/null
+     +++ b/e
+     @@ -0,0 +1,1 @@
+     +ee
+  
 
 Test old-style --rev
 
@@ -2384,7 +2391,8 @@ 
   o  2147483647:ffffffffffff
   |
   @  3:5918b8d165d1
-  .
+  |
+  ~
 
 node template with changeset_printer:
 
@@ -2393,8 +2401,10 @@ 
   |
   6    6:fc281d8ff18d
   |\
-  5 .  5:99b31f1c2782
-  . .
+  | ~
+  5  5:99b31f1c2782
+  |
+  ~
 
 node template with changeset_templater (shared cache variable):
 
@@ -2404,7 +2414,9 @@ 
   |
   #    6 foo-bar+0
   |\
-  o .  5 null+5
-  . .
+  | ~
+  o  5 null+5
+  |
+  ~
 
   $ cd ..
diff --git a/tests/test-histedit-arguments.t b/tests/test-histedit-arguments.t
--- a/tests/test-histedit-arguments.t
+++ b/tests/test-histedit-arguments.t
@@ -123,7 +123,8 @@ 
   o  3 c8e6 four
   |
   o  2 eb57 three
-  .
+  |
+  ~
   $ HGEDITOR=cat hg histedit -r 4 --commands - << EOF
   > edit 08d98a8350f3 4 five
   > EOF
@@ -151,7 +152,8 @@ 
   | o  3 c8e6 four
   |/
   o  2 eb57 three
-  .
+  |
+  ~
 
   $ hg unbundle -q $TESTTMP/foo/.hg/strip-backup/08d98a8350f3-02594089-backup.hg
   $ hg strip -q -r f5ed --config extensions.strip=
diff --git a/tests/test-largefiles-misc.t b/tests/test-largefiles-misc.t
--- a/tests/test-largefiles-misc.t
+++ b/tests/test-largefiles-misc.t
@@ -472,11 +472,11 @@ 
 
   $ hg log -G anotherlarge
   @  changeset:   1:9627a577c5e9
-  .  tag:         tip
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:00 1970 +0000
-  .  summary:     anotherlarge
-  .
+  |  tag:         tip
+  ~  user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     anotherlarge
+  
 
   $ hg log glob:another*
   changeset:   1:9627a577c5e9
@@ -488,7 +488,8 @@ 
   $ hg --debug log -T '{rev}: {desc}\n' -G glob:another*
   updated patterns: ['glob:../.hglf/sub/another*', 'glob:another*']
   @  1: anotherlarge
-  .
+  |
+  ~
 
 #if no-msys
   $ hg --debug log -T '{rev}: {desc}\n' 'glob:../.hglf/sub/another*' # no-msys
@@ -498,7 +499,8 @@ 
   $ hg --debug log -G -T '{rev}: {desc}\n' 'glob:../.hglf/sub/another*' # no-msys
   updated patterns: ['glob:../.hglf/sub/another*']
   @  1: anotherlarge
-  .
+  |
+  ~
 #endif
 
   $ echo more >> anotherlarge
@@ -533,11 +535,11 @@ 
   
   $ hg log -G glob:**another*
   @  changeset:   1:9627a577c5e9
-  .  tag:         tip
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:00 1970 +0000
-  .  summary:     anotherlarge
-  .
+  |  tag:         tip
+  ~  user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     anotherlarge
+  
 
   $ cd ..
 
diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t
--- a/tests/test-largefiles.t
+++ b/tests/test-largefiles.t
@@ -930,7 +930,8 @@ 
   7:daea875e9014
   $ hg log -Gqf sub2/large7
   @  7:daea875e9014
-  .
+  |
+  ~
   $ cd ..
 
 Test log from outside repo
@@ -1291,7 +1292,8 @@ 
   o  5:9d5af5072dbd  edit files again
   |
   o  4:74c02385b94c  move files
-  .
+  |
+  ~
   $ hg log --template '{rev}:{node|short}  {desc|firstline}\n' sub/large4
   8:a381d2c8c80e  modify normal file and largefile in repo b
   6:4355d653f84f  edit files yet again
@@ -1305,7 +1307,8 @@ 
   o  5:9d5af5072dbd  edit files again
   |
   o  4:74c02385b94c  move files
-  .
+  |
+  ~
 
 - .hglf only matches largefiles, without .hglf it matches 9 bco sub/normal
   $ hg log --template '{rev}:{node|short}  {desc|firstline}\n' .hglf/sub
diff --git a/tests/test-log.t b/tests/test-log.t
--- a/tests/test-log.t
+++ b/tests/test-log.t
@@ -2132,18 +2132,18 @@ 
   
   $ hg log -f -G b
   @  changeset:   3:9bc8ce7f9356
-  .  parent:      0:f7b1eb17ad24
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:00 1970 +0000
-  .  summary:     1
-  .
+  |  parent:      0:f7b1eb17ad24
+  ~  user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     1
+  
   $ hg log -G b
   @  changeset:   3:9bc8ce7f9356
-  .  parent:      0:f7b1eb17ad24
-  .  user:        test
-  .  date:        Thu Jan 01 00:00:00 1970 +0000
-  .  summary:     1
-  .
+  |  parent:      0:f7b1eb17ad24
+  ~  user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     1
+  
   $ cd ..
 
 Check proper report when the manifest changes but not the file issue4499
diff --git a/tests/test-rebase-pull.t b/tests/test-rebase-pull.t
--- a/tests/test-rebase-pull.t
+++ b/tests/test-rebase-pull.t
@@ -91,7 +91,8 @@ 
 
   $ hg tglog -l 1
   @  2: 'R1'
-  .
+  |
+  ~
 
 pull --rebase --update should ignore --update:
 
@@ -111,7 +112,8 @@ 
 
   $ hg tglog -l 1
   o  2: 'R1'
-  .
+  |
+  ~
 
   $ cd ..
 
diff --git a/tests/test-shelve.t b/tests/test-shelve.t
--- a/tests/test-shelve.t
+++ b/tests/test-shelve.t
@@ -718,7 +718,8 @@ 
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg log -G --template '{rev}  {desc|firstline}  {author}' -R bundle://.hg/shelved/default.hg -r 'bundle()'
   o  4  changes to: commit stuff  shelve@localhost
-  .
+  |
+  ~
   $ hg log -G --template '{rev}  {desc|firstline}  {author}'
   @  3  commit stuff  test
   |