Patchwork [3,of,4,V2] graphmod: use different styles for different edge types

login
register
mail settings
Submitter Martijn Pieters
Date March 4, 2016, 8:47 p.m.
Message ID <794d4e68aa4fcfc2da23.1457124425@mjpieters-mbp>
Download mbox | patch
Permalink /patch/13609/
State Changes Requested
Delegated to: Matt Mackall
Headers show

Comments

Martijn Pieters - March 4, 2016, 8:47 p.m.
# HG changeset patch
# User Martijn Pieters <mjpieters@fb.com>
# Date 1457102672 0
#      Fri Mar 04 14:44:32 2016 +0000
# Node ID 794d4e68aa4fcfc2da23bfd71ba1294eb82e37c3
# Parent  ddeb44b0971f0c34b23f5f541c5d9a0b8c6c5892
graphmod: use different styles for different edge types

Rather than always draw edges as solid lines, use dotted lines for edges that
do not connect to a parent, and dashed lines when connecting to a grandparent
(implying missing nodes in between).

This is part of the work towards moving smartlog upstream; currently smartlog
injects extra nodes into the graph to indicate grandparent relationships (nodes
elided).
Durham Goode - March 8, 2016, 8:16 a.m.
Could you provide some examples in the commit message, or an additional 
email with a link to a paste so we can see what the results look like?  
It's hard to give feedback on the output with only the test patches to 
go by.  I'm worried that in smartlog all the lines will be dotted, which 
will make their presence distracting and less informative.

For the smartlog functionality that injects extra nodes, what's the plan 
there?

On 3/4/16 12:47 PM, Martijn Pieters wrote:
> # HG changeset patch
> # User Martijn Pieters <mjpieters@fb.com>
> # Date 1457102672 0
> #      Fri Mar 04 14:44:32 2016 +0000
> # Node ID 794d4e68aa4fcfc2da23bfd71ba1294eb82e37c3
> # Parent  ddeb44b0971f0c34b23f5f541c5d9a0b8c6c5892
> graphmod: use different styles for different edge types
>
> Rather than always draw edges as solid lines, use dotted lines for edges that
> do not connect to a parent, and dashed lines when connecting to a grandparent
> (implying missing nodes in between).
>
> This is part of the work towards moving smartlog upstream; currently smartlog
> injects extra nodes into the graph to indicate grandparent relationships (nodes
> elided).
>
> diff --git a/mercurial/graphmod.py b/mercurial/graphmod.py
> --- a/mercurial/graphmod.py
> +++ b/mercurial/graphmod.py
> @@ -31,6 +31,7 @@
>   PARENT = 'P'
>   GRANDPARENT = 'G'
>   MISSINGPARENT = 'M'
> +EDGES = {PARENT: '|', GRANDPARENT: ':', MISSINGPARENT: '.'}
>   
>   def groupbranchiter(revs, parentsfunc, firstbranch=()):
>       """Yield revisions from heads to roots one (topo) branch at a time.
> @@ -390,11 +391,13 @@
>               knownparents.append(parent)
>           else:
>               newparents.append(parent)
> +            state['edges'][parent] = EDGES.get(ptype, '|')
>   
>       ncols = len(seen)
>       nextseen = seen[:]
>       nextseen[nodeidx:nodeidx + 1] = newparents
> -    edges = [(nodeidx, nextseen.index(p)) for p in knownparents if p != nullrev]
> +    edges = [(nodeidx, nextseen.index(p))
> +             for p in knownparents if p != nullrev]
>   
>       while len(newparents) > 2:
>           # ascii() only knows how to add or remove a single column between two
> @@ -418,6 +421,8 @@
>           edges.append((nodeidx, nodeidx + 1))
>       nmorecols = len(nextseen) - ncols
>       seen[:] = nextseen
> +    # remove current node from edge characters, no longer needed
> +    state['edges'].pop(rev, None)
>       yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
>   
>   def _fixlongrightedges(edges):
> @@ -426,27 +431,28 @@
>               edges[i] = (start, end + 1)
>   
>   def _getnodelineedgestail(
> -        node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail):
> -    if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0:
> +        echars, idx, pidx, ncols, coldiff, pdiff, fix_tail):
> +    if fix_tail and coldiff == pdiff and coldiff != 0:
>           # Still going in the same non-vertical direction.
> -        if n_columns_diff == -1:
> -            start = max(node_index + 1, p_node_index)
> -            tail = ["|", " "] * (start - node_index - 1)
> -            tail.extend(["/", " "] * (n_columns - start))
> +        if coldiff == -1:
> +            start = max(idx + 1, pidx)
> +            tail = echars[idx * 2:(start - 1) * 2]
> +            tail.extend(["/", " "] * (ncols - start))
>               return tail
>           else:
> -            return ["\\", " "] * (n_columns - node_index - 1)
> +            return ["\\", " "] * (ncols - idx - 1)
>       else:
> -        return ["|", " "] * (n_columns - node_index - 1)
> +        remainder = (ncols - idx - 1)
> +        return echars[-(remainder * 2):] if remainder > 0 else []
>   
> -def _drawedges(edges, nodeline, interline):
> +def _drawedges(echars, edges, nodeline, interline):
>       for (start, end) in edges:
>           if start == end + 1:
>               interline[2 * end + 1] = "/"
>           elif start == end - 1:
>               interline[2 * start + 1] = "\\"
>           elif start == end:
> -            interline[2 * start] = "|"
> +            interline[2 * start] = echars[2 * start]
>           else:
>               if 2 * end >= len(nodeline):
>                   continue
> @@ -457,26 +463,29 @@
>                   if nodeline[i] != "+":
>                       nodeline[i] = "-"
>   
> -def _getpaddingline(ni, n_columns, edges):
> -    line = []
> -    line.extend(["|", " "] * ni)
> -    if (ni, ni - 1) in edges or (ni, ni) in edges:
> -        # (ni, ni - 1)      (ni, ni)
> +def _getpaddingline(echars, idx, ncols, edges):
> +    # all edges up to the current node
> +    line = echars[:idx * 2]
> +    # an edge for the current node, if there is one
> +    if (idx, idx - 1) in edges or (idx, idx) in edges:
> +        # (idx, idx - 1)      (idx, idx)
>           # | | | |           | | | |
>           # +---o |           | o---+
> -        # | | c |           | c | |
> +        # | | X |           | X | |
>           # | |/ /            | |/ /
>           # | | |             | | |
> -        c = "|"
> +        line.extend(echars[idx * 2:(idx + 1) * 2])
>       else:
> -        c = " "
> -    line.extend([c, " "])
> -    line.extend(["|", " "] * (n_columns - ni - 1))
> +        line.extend('  ')
> +    # all edges to the right of the current node
> +    remainder = ncols - idx - 1
> +    if remainder > 0:
> +        line.extend(echars[-(remainder * 2):])
>       return line
>   
>   def asciistate():
>       """returns the initial value for the "state" argument to ascii()"""
> -    return {'seen': [], 'lastcoldiff': 0, 'lastindex': 0}
> +    return {'seen': [], 'edges': {}, 'lastcoldiff': 0, 'lastindex': 0}
>   
>   def ascii(ui, state, type, char, text, coldata):
>       """prints an ASCII graph of the DAG
> @@ -498,9 +507,15 @@
>           in the current revision. That is: -1 means one column removed;
>           0 means no columns added or removed; 1 means one column added.
>       """
> -
>       idx, edges, ncols, coldiff = coldata
>       assert -2 < coldiff < 2
> +
> +    edgemap, seen = state['edges'], state['seen']
> +    # Be tolerant of history issues; make sure we have at least ncols + coldiff
> +    # elements to work with. See test-glog.t for broken history test cases.
> +    echars = [c for p in seen for c in (edgemap.get(p, '|'), ' ')]
> +    echars.extend(('|', ' ') * max(ncols + coldiff - len(seen), 0))
> +
>       if coldiff == -1:
>           # Transform
>           #
> @@ -530,35 +545,33 @@
>       fix_nodeline_tail = len(text) <= 2 and not add_padding_line
>   
>       # nodeline is the line containing the node character (typically o)
> -    nodeline = ["|", " "] * idx
> +    nodeline = echars[:idx * 2]
>       nodeline.extend([char, " "])
>   
>       nodeline.extend(
> -        _getnodelineedgestail(idx, state['lastindex'], ncols, coldiff,
> -                              state['lastcoldiff'], fix_nodeline_tail))
> +        _getnodelineedgestail(
> +            echars, idx, state['lastindex'], ncols, coldiff,
> +            state['lastcoldiff'], fix_nodeline_tail))
>   
>       # shift_interline is the line containing the non-vertical
>       # edges between this entry and the next
> -    shift_interline = ["|", " "] * idx
> +    shift_interline = echars[:idx * 2]
> +    shift_interline.extend(' ' * (2 + coldiff))
> +    count = ncols - idx - 1
>       if coldiff == -1:
> -        n_spaces = 1
> -        edge_ch = "/"
> +        shift_interline.extend('/ ' * count)
>       elif coldiff == 0:
> -        n_spaces = 2
> -        edge_ch = "|"
> +        shift_interline.extend(echars[(idx + 1) * 2:ncols * 2])
>       else:
> -        n_spaces = 3
> -        edge_ch = "\\"
> -    shift_interline.extend(n_spaces * [" "])
> -    shift_interline.extend([edge_ch, " "] * (ncols - idx - 1))
> +        shift_interline.extend(r'\ ' * count)
>   
>       # draw edges from the current node to its parents
> -    _drawedges(edges, nodeline, shift_interline)
> +    _drawedges(echars, edges, nodeline, shift_interline)
>   
>       # lines is the list of all graph lines to print
>       lines = [nodeline]
>       if add_padding_line:
> -        lines.append(_getpaddingline(idx, ncols, edges))
> +        lines.append(_getpaddingline(echars, idx, ncols, edges))
>       lines.append(shift_interline)
>   
>       # make sure that there are as many graph lines as there are
> @@ -566,7 +579,7 @@
>       while len(text) < len(lines):
>           text.append("")
>       if len(lines) < len(text):
> -        extra_interline = ["|", " "] * (ncols + coldiff)
> +        extra_interline = echars[:(ncols + coldiff) * 2]
>           while len(lines) < len(text):
>               lines.append(extra_interline)
>   
> 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,7 @@
>     | 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-copy-move-merge.t b/tests/test-copy-move-merge.t
> --- a/tests/test-copy-move-merge.t
> +++ b/tests/test-copy-move-merge.t
> @@ -156,11 +156,11 @@
>   
>     $ hg log -G -f b
>     @  changeset:   3:76024fb4b05b
> -  |  tag:         tip
> -  |  user:        test
> -  |  date:        Thu Jan 01 00:00:00 1970 +0000
> -  |  summary:     copy a->b (2)
> -  |
> +  :  tag:         tip
> +  :  user:        test
> +  :  date:        Thu Jan 01 00:00:00 1970 +0000
> +  :  summary:     copy a->b (2)
> +  :
>     o  changeset:   0:ac82d8b1f7c4
>        user:        test
>        date:        Thu Jan 01 00:00:00 1970 +0000
> diff --git a/tests/test-glog-topological.t b/tests/test-glog-topological.t
> --- a/tests/test-glog-topological.t
> +++ b/tests/test-glog-topological.t
> @@ -66,11 +66,11 @@
>     o  8
>     |
>     o  3
> -  |
> +  :
>     o  1
>     |
>     | o  7
> -  | |
> +  | :
>     | o  5
>     | |
>     | o  4
> diff --git a/tests/test-glog.t b/tests/test-glog.t
> --- a/tests/test-glog.t
> +++ b/tests/test-glog.t
> @@ -940,193 +940,193 @@
>     $ hg log -G -r 'file("a")' -m
>     o    changeset:   32:d06dffa21a31
>     |\   parent:      27:886ed638191b
> -  | |  parent:      31:621d83e11f67
> -  | |  user:        test
> -  | |  date:        Thu Jan 01 00:00:32 1970 +0000
> -  | |  summary:     (32) expand
> -  | |
> -  o |  changeset:   31:621d83e11f67
> -  |\|  parent:      21:d42a756af44d
> -  | |  parent:      30:6e11cd4b648f
> -  | |  user:        test
> -  | |  date:        Thu Jan 01 00:00:31 1970 +0000
> -  | |  summary:     (31) expand
> -  | |
> -  o |    changeset:   30:6e11cd4b648f
> +  | :  parent:      31:621d83e11f67
> +  | :  user:        test
> +  | :  date:        Thu Jan 01 00:00:32 1970 +0000
> +  | :  summary:     (32) expand
> +  | :
> +  o :  changeset:   31:621d83e11f67
> +  |\:  parent:      21:d42a756af44d
> +  | :  parent:      30:6e11cd4b648f
> +  | :  user:        test
> +  | :  date:        Thu Jan 01 00:00:31 1970 +0000
> +  | :  summary:     (31) expand
> +  | :
> +  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:      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:      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
> -  | | | | |
> +  | | . . :  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:      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
> -  | | | | | |
> +  | | . . . :  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:      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
> -  | | | | | |
> +  | . . . :    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
> -  | | | | | |
> +  | . . . |    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:      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
> -  | | | | | |
> +  . . . | |    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
> -  | | | | | |
> +  . . . | |    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
> -  | | | | | |
> +  . . . | |/   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
> -  | | | | | |
> +  . . . | |/   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:      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 +1139,20 @@
>   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 +1176,10 @@
>     |  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
> @@ -1277,17 +1277,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 +1298,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 +1368,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 +1408,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 +1796,8 @@
>     $ 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 +1875,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 +1939,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 +2384,7 @@
>     o  2147483647:ffffffffffff
>     |
>     @  3:5918b8d165d1
> -  |
> +  .
>   
>   node template with changeset_printer:
>   
> @@ -2393,8 +2393,8 @@
>     |
>     6    6:fc281d8ff18d
>     |\
> -  5 |  5:99b31f1c2782
> -  | |
> +  5 .  5:99b31f1c2782
> +  . .
>   
>   node template with changeset_templater (shared cache variable):
>   
> @@ -2404,7 +2404,7 @@
>     |
>     #    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,7 @@
>     o  3 c8e6 four
>     |
>     o  2 eb57 three
> -  |
> +  .
>     $ HGEDITOR=cat hg histedit -r 4 --commands - << EOF
>     > edit 08d98a8350f3 4 five
>     > EOF
> @@ -151,7 +151,7 @@
>     | 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,7 @@
>     $ 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 +498,7 @@
>     $ 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 +533,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,7 @@
>     7:daea875e9014
>     $ hg log -Gqf sub2/large7
>     @  7:daea875e9014
> -  |
> +  .
>     $ cd ..
>   
>   Test log from outside repo
> @@ -1285,13 +1285,13 @@
>     4:74c02385b94c  move files
>     $ hg log -G --template '{rev}:{node|short}  {desc|firstline}\n' .hglf/sub/large4
>     o  8:a381d2c8c80e  modify normal file and largefile in repo b
> -  |
> +  :
>     o  6:4355d653f84f  edit files yet again
>     |
>     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
> @@ -1299,13 +1299,13 @@
>     4:74c02385b94c  move files
>     $ hg log -G --template '{rev}:{node|short}  {desc|firstline}\n' .hglf/sub/large4
>     o  8:a381d2c8c80e  modify normal file and largefile in repo b
> -  |
> +  :
>     o  6:4355d653f84f  edit files yet again
>     |
>     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
> @@ -1317,13 +1317,13 @@
>     0:30d30fe6a5be  add files
>     $ hg log -G --template '{rev}:{node|short}  {desc|firstline}\n' .hglf/sub
>     o  8:a381d2c8c80e  modify normal file and largefile in repo b
> -  |
> +  :
>     o  6:4355d653f84f  edit files yet again
>     |
>     o  5:9d5af5072dbd  edit files again
>     |
>     o  4:74c02385b94c  move files
> -  |
> +  :
>     o  1:ce8896473775  edit files
>     |
>     o  0:30d30fe6a5be  add files
> @@ -1340,13 +1340,13 @@
>     @  9:598410d3eb9a  modify normal file largefile in repo d
>     |
>     o  8:a381d2c8c80e  modify normal file and largefile in repo b
> -  |
> +  :
>     o  6:4355d653f84f  edit files yet again
>     |
>     o  5:9d5af5072dbd  edit files again
>     |
>     o  4:74c02385b94c  move files
> -  |
> +  :
>     o  1:ce8896473775  edit files
>     |
>     o  0:30d30fe6a5be  add files
> @@ -1364,13 +1364,13 @@
>     @  9:598410d3eb9a  modify normal file largefile in repo d
>     |
>     o  8:a381d2c8c80e  modify normal file and largefile in repo b
> -  |
> +  :
>     o  6:4355d653f84f  edit files yet again
>     |
>     o  5:9d5af5072dbd  edit files again
>     |
>     o  4:74c02385b94c  move files
> -  |
> +  :
>     o  1:ce8896473775  edit files
>     |
>     o  0:30d30fe6a5be  add files
> diff --git a/tests/test-log.t b/tests/test-log.t
> --- a/tests/test-log.t
> +++ b/tests/test-log.t
> @@ -1970,10 +1970,10 @@
>     |  summary:     content3
>     |
>     o  changeset:   3:15b2327059e5
> -  |  user:        test
> -  |  date:        Thu Jan 01 00:00:00 1970 +0000
> -  |  summary:     content2
> -  |
> +  :  user:        test
> +  :  date:        Thu Jan 01 00:00:00 1970 +0000
> +  :  summary:     content2
> +  :
>     o  changeset:   0:ae0a3c9f9e95
>        user:        test
>        date:        Thu Jan 01 00:00:00 1970 +0000
> @@ -1985,16 +1985,16 @@
>   
>     $ hg log -G a
>     @  changeset:   4:50b9b36e9c5d
> -  |  tag:         tip
> -  |  user:        test
> -  |  date:        Thu Jan 01 00:00:00 1970 +0000
> -  |  summary:     content3
> -  |
> -  | o  changeset:   1:2294ae80ad84
> -  |/   user:        test
> -  |    date:        Thu Jan 01 00:00:00 1970 +0000
> -  |    summary:     content2
> -  |
> +  :  tag:         tip
> +  :  user:        test
> +  :  date:        Thu Jan 01 00:00:00 1970 +0000
> +  :  summary:     content3
> +  :
> +  : o  changeset:   1:2294ae80ad84
> +  :/   user:        test
> +  :    date:        Thu Jan 01 00:00:00 1970 +0000
> +  :    summary:     content2
> +  :
>     o  changeset:   0:ae0a3c9f9e95
>        user:        test
>        date:        Thu Jan 01 00:00:00 1970 +0000
> @@ -2008,10 +2008,10 @@
>     1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>     $ hg log -Gf a
>     @  changeset:   3:15b2327059e5
> -  |  user:        test
> -  |  date:        Thu Jan 01 00:00:00 1970 +0000
> -  |  summary:     content2
> -  |
> +  :  user:        test
> +  :  date:        Thu Jan 01 00:00:00 1970 +0000
> +  :  summary:     content2
> +  :
>     o  changeset:   0:ae0a3c9f9e95
>        user:        test
>        date:        Thu Jan 01 00:00:00 1970 +0000
> @@ -2059,10 +2059,10 @@
>     |  summary:     content3
>     |
>     @  changeset:   3:15b2327059e5
> -  |  user:        test
> -  |  date:        Thu Jan 01 00:00:00 1970 +0000
> -  |  summary:     content2
> -  |
> +  :  user:        test
> +  :  date:        Thu Jan 01 00:00:00 1970 +0000
> +  :  summary:     content2
> +  :
>     o  changeset:   0:ae0a3c9f9e95
>        user:        test
>        date:        Thu Jan 01 00:00:00 1970 +0000
> @@ -2076,11 +2076,11 @@
>     $ hg debugobsolete 50b9b36e9c5df2c6fc6dcefa8ad0da929e84aed2
>     $ hg log -G a
>     @  changeset:   3:15b2327059e5
> -  |  tag:         tip
> -  |  user:        test
> -  |  date:        Thu Jan 01 00:00:00 1970 +0000
> -  |  summary:     content2
> -  |
> +  :  tag:         tip
> +  :  user:        test
> +  :  date:        Thu Jan 01 00:00:00 1970 +0000
> +  :  summary:     content2
> +  :
>     o  changeset:   0:ae0a3c9f9e95
>        user:        test
>        date:        Thu Jan 01 00:00:00 1970 +0000
> @@ -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,7 @@
>   
>     $ hg tglog -l 1
>     @  2: 'R1'
> -  |
> +  .
>   
>   pull --rebase --update should ignore --update:
>   
> @@ -111,7 +111,7 @@
>   
>     $ hg tglog -l 1
>     o  2: 'R1'
> -  |
> +  .
>   
>     $ cd ..
>   
> diff --git a/tests/test-rebase-rename.t b/tests/test-rebase-rename.t
> --- a/tests/test-rebase-rename.t
> +++ b/tests/test-rebase-rename.t
> @@ -298,7 +298,7 @@
>     o  3: 'File c created as copy of b and modified'
>     |
>     o  2: 'File b created as copy of a and modified'
> -  |
> +  :
>     o  0: 'File a created'
>     
>   Same steps as above, but with --collapse on rebase to make sure the
> @@ -323,9 +323,9 @@
>   
>     $ hg tglog --follow d
>     @  3: 'Collapsed revision
> -  |  * File b created as copy of a and modified
> -  |  * File c created as copy of b and modified
> -  |  * File d created as copy of c and modified'
> +  :  * File b created as copy of a and modified
> +  :  * File c created as copy of b and modified
> +  :  * File d created as copy of c and modified'
>     o  0: 'File a created'
>     
>   
> 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,7 @@
>     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
>     |
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://urldefense.proofpoint.com/v2/url?u=https-3A__www.mercurial-2Dscm.org_mailman_listinfo_mercurial-2Ddevel&d=CwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=nuarHzhP1wi1T9iURRCj1A&m=XshBZtmCWRlCBvnJnmHoqLgrA58KJPxyQWIpLecUbtc&s=vhdYJ8eko-xSwUoKv0C9yMKQ3ncGIbmxcopziUK57gI&e=
Martijn Pieters - March 8, 2016, 2:03 p.m.
On 8 March 2016 at 08:16, Durham Goode <durham@fb.com> wrote:
> Could you provide some examples in the commit message, or an additional
> email with a link to a paste so we can see what the results look like?  It's
> hard to give feedback on the output with only the test patches to go by.
> I'm worried that in smartlog all the lines will be dotted, which will make
> their presence distracting and less informative.
>
> For the smartlog functionality that injects extra nodes, what's the plan
> there?

Smartlog will no longer inject extra nodes. Instead of

o  9974b8  danek  remote/@
|  tests: Solaris grep doesn't add a trailing newline when it's missing
|
.
.
|
o  158bdc  timeless  @ stable
|  shelve: lowercase flag description
|

smartlog would show

o  9974b8  danek  remote/@
:  tests: Solaris grep doesn't add a trailing newline when it's missing
:
o  158bdc  timeless  @  stable
|  shelve: lowercase flag description
~

(actual output from a hg sl command in my mercurial working copy, just
the last two entries). The above shows both a grandparent relationship
(where smartlog injected an extra node to render the two dots) and a
missing parent relationship (where smartlog and hg log -G draw a line
that just peters out).

As for a larger example, this is a cut-down version of the test in
test-glog.t; as it was originally before my changes:

  o    changeset:   32:d06dffa21a31
  |\   parent:      27:886ed638191b
  | |  parent:      31:621d83e11f67
  | |  user:        test
  | |  date:        Thu Jan 01 00:00:32 1970 +0000
  | |  summary:     (32) expand
  | |
  o |  changeset:   31:621d83e11f67
  |\|  parent:      21:d42a756af44d
  | |  parent:      30:6e11cd4b648f
  | |  user:        test
  | |  date:        Thu Jan 01 00:00:31 1970 +0000
  | |  summary:     (31) expand
  | |
  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
  | | | | |

Changing the style of edge lines based on the relationship turns that into:

  o    changeset:   32:d06dffa21a31
  |\   parent:      27:886ed638191b
  | :  parent:      31:621d83e11f67
  | :  user:        test
  | :  date:        Thu Jan 01 00:00:32 1970 +0000
  | :  summary:     (32) expand
  | :
  o :  changeset:   31:621d83e11f67
  |\:  parent:      21:d42a756af44d
  | :  parent:      30:6e11cd4b648f
  | :  user:        test
  | :  date:        Thu Jan 01 00:00:31 1970 +0000
  | :  summary:     (31) expand
  | :
  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
  . . . . .

So edges that lead to a grandparent (intermediate nodes are missing)
are depicted using : lines. Edges to nodes that are not part of the
graph at all are depicted as . lines. For example, node 27 is not part
of the graph, but 21, an ancestor to 27, is, so the edge between 32
and 21 is drawn as a : dotted line. The same applies for node 18
between 21 and 22. Nodes 0, 1, 15, 17 and 29, are all missing from the
graph, edges that try to connect to those are drawn as . dotted lines.

The big win comes from then terminating missing-parent edges early:

  o    changeset:   32:d06dffa21a31
  |\   parent:      27:886ed638191b
  | :  parent:      31:621d83e11f67
  | :  user:        test
  | :  date:        Thu Jan 01 00:00:32 1970 +0000
  | :  summary:     (32) expand
  | :
  o :  changeset:   31:621d83e11f67
  |\:  parent:      21:d42a756af44d
  | :  parent:      30:6e11cd4b648f
  | :  user:        test
  | :  date:        Thu Jan 01 00:00:31 1970 +0000
  | :  summary:     (31) expand
  | :
  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
Augie Fackler - March 8, 2016, 3:27 p.m.
On Fri, Mar 04, 2016 at 08:47:05PM +0000, Martijn Pieters wrote:
> # HG changeset patch
> # User Martijn Pieters <mjpieters@fb.com>
> # Date 1457102672 0
> #      Fri Mar 04 14:44:32 2016 +0000
> # Node ID 794d4e68aa4fcfc2da23bfd71ba1294eb82e37c3
> # Parent  ddeb44b0971f0c34b23f5f541c5d9a0b8c6c5892
> graphmod: use different styles for different edge types

Looks good to me, but I think we might want to flag this with (BC) for
the poor souls that have been parsing our graph output? I know at
least one pile of emacs lisp that does (monky). Matt?
Durham Goode - March 8, 2016, 5:42 p.m.
Your change helps a bunch in the case where ancestors aren't present, 
but that's pretty rare in our code base at least (since we have very few 
merges).  Here is the before and after smartlog output from my hg repo: 
https://bpaste.net/show/2093d7bad9c1

I actually find the dashed line detracts from the general glance-ability 
of the data, and am not sure we'd want to replace smartlog with this 
output just yet.  Is there a config option to disable these line stylings?

On 3/8/16 6:03 AM, Martijn Pieters wrote:
> On 8 March 2016 at 08:16, Durham Goode <durham@fb.com> wrote:
>> Could you provide some examples in the commit message, or an additional
>> email with a link to a paste so we can see what the results look like?  It's
>> hard to give feedback on the output with only the test patches to go by.
>> I'm worried that in smartlog all the lines will be dotted, which will make
>> their presence distracting and less informative.
>>
>> For the smartlog functionality that injects extra nodes, what's the plan
>> there?
> Smartlog will no longer inject extra nodes. Instead of
>
> o  9974b8  danek  remote/@
> |  tests: Solaris grep doesn't add a trailing newline when it's missing
> |
> .
> .
> |
> o  158bdc  timeless  @ stable
> |  shelve: lowercase flag description
> |
>
> smartlog would show
>
> o  9974b8  danek  remote/@
> :  tests: Solaris grep doesn't add a trailing newline when it's missing
> :
> o  158bdc  timeless  @  stable
> |  shelve: lowercase flag description
> ~
>
> (actual output from a hg sl command in my mercurial working copy, just
> the last two entries). The above shows both a grandparent relationship
> (where smartlog injected an extra node to render the two dots) and a
> missing parent relationship (where smartlog and hg log -G draw a line
> that just peters out).
>
> As for a larger example, this is a cut-down version of the test in
> test-glog.t; as it was originally before my changes:
>
>    o    changeset:   32:d06dffa21a31
>    |\   parent:      27:886ed638191b
>    | |  parent:      31:621d83e11f67
>    | |  user:        test
>    | |  date:        Thu Jan 01 00:00:32 1970 +0000
>    | |  summary:     (32) expand
>    | |
>    o |  changeset:   31:621d83e11f67
>    |\|  parent:      21:d42a756af44d
>    | |  parent:      30:6e11cd4b648f
>    | |  user:        test
>    | |  date:        Thu Jan 01 00:00:31 1970 +0000
>    | |  summary:     (31) expand
>    | |
>    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
>    | | | | |
>
> Changing the style of edge lines based on the relationship turns that into:
>
>    o    changeset:   32:d06dffa21a31
>    |\   parent:      27:886ed638191b
>    | :  parent:      31:621d83e11f67
>    | :  user:        test
>    | :  date:        Thu Jan 01 00:00:32 1970 +0000
>    | :  summary:     (32) expand
>    | :
>    o :  changeset:   31:621d83e11f67
>    |\:  parent:      21:d42a756af44d
>    | :  parent:      30:6e11cd4b648f
>    | :  user:        test
>    | :  date:        Thu Jan 01 00:00:31 1970 +0000
>    | :  summary:     (31) expand
>    | :
>    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
>    . . . . .
>
> So edges that lead to a grandparent (intermediate nodes are missing)
> are depicted using : lines. Edges to nodes that are not part of the
> graph at all are depicted as . lines. For example, node 27 is not part
> of the graph, but 21, an ancestor to 27, is, so the edge between 32
> and 21 is drawn as a : dotted line. The same applies for node 18
> between 21 and 22. Nodes 0, 1, 15, 17 and 29, are all missing from the
> graph, edges that try to connect to those are drawn as . dotted lines.
>
> The big win comes from then terminating missing-parent edges early:
>
>    o    changeset:   32:d06dffa21a31
>    |\   parent:      27:886ed638191b
>    | :  parent:      31:621d83e11f67
>    | :  user:        test
>    | :  date:        Thu Jan 01 00:00:32 1970 +0000
>    | :  summary:     (32) expand
>    | :
>    o :  changeset:   31:621d83e11f67
>    |\:  parent:      21:d42a756af44d
>    | :  parent:      30:6e11cd4b648f
>    | :  user:        test
>    | :  date:        Thu Jan 01 00:00:31 1970 +0000
>    | :  summary:     (31) expand
>    | :
>    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
>
>
Tim Delaney - March 8, 2016, 10:02 p.m.
On 9 March 2016 at 04:42, Durham Goode <durham@fb.com> wrote:

> Your change helps a bunch in the case where ancestors aren't present, but
> that's pretty rare in our code base at least (since we have very few
> merges).  Here is the before and after smartlog output from my hg repo:
> https://bpaste.net/show/2093d7bad9c1
>
> I actually find the dashed line detracts from the general glance-ability
> of the data, and am not sure we'd want to replace smartlog with this output
> just yet.  Is there a config option to disable these line stylings?


How does it look to you if you replace colon (:) with exclamation mark (!)?
Note: need to be a little careful with find/replace to avoid changing
colons in the text. Personally, I don't like it, but it does give a more
solid but broken line.

Another idea - do we need the entire path showing the grandparent
relationship? Would it be enough to just have it at the start (and probably
end) of the path?

@  4932aa  mjpieters
:  graphmod: end edges to missing parents early.
|
| o  d01268  durham
| :  parsers: optimize filtered headrevs logic
| |
| | o  55f8ae  durham
| |/   branchmap: check node against changelog instead of repo
| |
| | o  54f93f  durham  prof
| | |  Add proftimer
| | |
+---o  8a40e9  durham
| |    branchmap: check node against nodemap instead of changelog (for perf)
: |
o |  5cef34  durham  hgvip/release-2016-02-17
| |  test: remove dependency on $PYTHONDIR
| |
o |  4f99a5  durham
| | test: quick fix for test-hook
| |
o |  95bf01  quark  fbcrew/@
| |  chg: forward umask from client to server
| |
o |  e48d77  quark
| |  chgserver: add setumask method
| |

and with merges:

o    changeset:   32:d06dffa21a31
|\   parent:      27:886ed638191b
| :  parent:      31:621d83e11f67
| |  user:        test
| |  date:        Thu Jan 01 00:00:32 1970 +0000
| |  summary:     (32) expand
| |
o |  changeset:   31:621d83e11f67
|\|  parent:      21:d42a756af44d
| |  parent:      30:6e11cd4b648f
| |  date:        Thu Jan 01 00:00:31 1970 +0000
| |  summary:     (31) expand
| |
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

Tim Delaney
Durham Goode - March 8, 2016, 11:51 p.m.
On 3/8/16 2:02 PM, Tim Delaney wrote:
> On 9 March 2016 at 04:42, Durham Goode <durham@fb.com 
> <mailto:durham@fb.com>> wrote:
>
>     Your change helps a bunch in the case where ancestors aren't
>     present, but that's pretty rare in our code base at least (since
>     we have very few merges).  Here is the before and after smartlog
>     output from my hg repo: https://bpaste.net/show/2093d7bad9c1
>     <https://urldefense.proofpoint.com/v2/url?u=https-3A__bpaste.net_show_2093d7bad9c1&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=nuarHzhP1wi1T9iURRCj1A&m=Ix7YLrzTSql7jLWOBs__ZDQLdJjoyuycoz3rbHzG16M&s=XWseVzXeEz1WRMYHFNEkVeXWNQ8rm7PMkOKRGdf50yg&e=>
>
>     I actually find the dashed line detracts from the general
>     glance-ability of the data, and am not sure we'd want to replace
>     smartlog with this output just yet.  Is there a config option to
>     disable these line stylings?
>
>
> How does it look to you if you replace colon (:) with exclamation mark 
> (!)? Note: need to be a little careful with find/replace to avoid 
> changing colons in the text. Personally, I don't like it, but it does 
> give a more solid but broken line.
Martijn tried it with a exclamation mark before (I saw an early 
prototype) and I think that was also not great (it was too subtle in 
some cases, and didn't really produce the dashed effect that would 
convey the not-my-parent notion).
>
> Another idea - do we need the entire path showing the grandparent 
> relationship? Would it be enough to just have it at the start (and 
> probably end) of the path?
This is what smartlog does, to some degree.  But smartlog inserts a full 
node (with no text) into the graph algorithm and draws an ellipsis on 
the line for that node.  Having ':' in a couple spots on the line might 
be interesting.  I'd probably not have the ':' as the first character in 
the line. Replacing the | on the blank line following the commit makes 
it obvious it's a break in the line that occurs just after the commit  
(having the : on the same line as some of the commit text drew my eye to 
that line and made me think the : was highlighting some aspect of that line.

@  4932aa  mjpieters
|  graphmod: end edges to missing parents early.
:
| o  d01268  durham
| |  parsers: optimize filtered headrevs logic
| :
| | o  55f8ae  durham
| |/   branchmap: check node against changelog instead of repo
| :
| |
o |  5cef34  durham  hgvip/release-2016-02-17
| |  test: remove dependency on $PYTHONDIR
| |
o |  4f99a5  durham
| | test: quick fix for test-hook
| |
o |  95bf01  quark  fbcrew/@
| |  chg: forward umask from client to server
| |
o |  e48d77  quark
| |  chgserver: add setumask method
| |

and

o    changeset:   32:d06dffa21a31
|\   parent:      27:886ed638191b
| |  parent:      31:621d83e11f67
| |  user:        test
| |  date:        Thu Jan 01 00:00:32 1970 +0000
| |  summary:     (32) expand
| :
o |  changeset:   31:621d83e11f67
|\|  parent:      21:d42a756af44d
| |  parent:      30:6e11cd4b648f
| |  date:        Thu Jan 01 00:00:31 1970 +0000
| |  summary:     (31) expand
| |
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
Pierre-Yves David - March 9, 2016, 2:40 p.m.
On 03/04/2016 08:47 PM, Martijn Pieters wrote:
> # HG changeset patch
> # User Martijn Pieters <mjpieters@fb.com>
> # Date 1457102672 0
> #      Fri Mar 04 14:44:32 2016 +0000
> # Node ID 794d4e68aa4fcfc2da23bfd71ba1294eb82e37c3
> # Parent  ddeb44b0971f0c34b23f5f541c5d9a0b8c6c5892
> graphmod: use different styles for different edge types
>
> Rather than always draw edges as solid lines, use dotted lines for edges that
> do not connect to a parent, and dashed lines when connecting to a grandparent
> (implying missing nodes in between).
>
> This is part of the work towards moving smartlog upstream; currently smartlog
> injects extra nodes into the graph to indicate grandparent relationships (nodes
> elided).

As durham mention, that would be nice to have an exemple output in the 
description.

Can we have change for each relation types in different changeset? This 
would help discussion of each of them.

I like the ":" for grandparent, but I'm not fan of using "." for missing 
parent. I feel like we should safe "." something more common/important 
like obsolescence relation.

I like the fact we don't include the elypsis node. It allows a much more 
compact result.
Pierre-Yves David - March 9, 2016, 2:42 p.m.
On 03/08/2016 03:27 PM, Augie Fackler wrote:
> On Fri, Mar 04, 2016 at 08:47:05PM +0000, Martijn Pieters wrote:
>> # HG changeset patch
>> # User Martijn Pieters <mjpieters@fb.com>
>> # Date 1457102672 0
>> #      Fri Mar 04 14:44:32 2016 +0000
>> # Node ID 794d4e68aa4fcfc2da23bfd71ba1294eb82e37c3
>> # Parent  ddeb44b0971f0c34b23f5f541c5d9a0b8c6c5892
>> graphmod: use different styles for different edge types
>
> Looks good to me, but I think we might want to flag this with (BC) for
> the poor souls that have been parsing our graph output? I know at
> least one pile of emacs lisp that does (monky). Matt?

Could we provide a way to expose the raw graph information in a machine 
friendly way? (-T json?, hg debuggraph?) so that we break these people 
once but we offer the migration to a nice a stable alternative?

Martijn, do you have idea about how to do this?

Cheers,

Patch

diff --git a/mercurial/graphmod.py b/mercurial/graphmod.py
--- a/mercurial/graphmod.py
+++ b/mercurial/graphmod.py
@@ -31,6 +31,7 @@ 
 PARENT = 'P'
 GRANDPARENT = 'G'
 MISSINGPARENT = 'M'
+EDGES = {PARENT: '|', GRANDPARENT: ':', MISSINGPARENT: '.'}
 
 def groupbranchiter(revs, parentsfunc, firstbranch=()):
     """Yield revisions from heads to roots one (topo) branch at a time.
@@ -390,11 +391,13 @@ 
             knownparents.append(parent)
         else:
             newparents.append(parent)
+            state['edges'][parent] = EDGES.get(ptype, '|')
 
     ncols = len(seen)
     nextseen = seen[:]
     nextseen[nodeidx:nodeidx + 1] = newparents
-    edges = [(nodeidx, nextseen.index(p)) for p in knownparents if p != nullrev]
+    edges = [(nodeidx, nextseen.index(p))
+             for p in knownparents if p != nullrev]
 
     while len(newparents) > 2:
         # ascii() only knows how to add or remove a single column between two
@@ -418,6 +421,8 @@ 
         edges.append((nodeidx, nodeidx + 1))
     nmorecols = len(nextseen) - ncols
     seen[:] = nextseen
+    # remove current node from edge characters, no longer needed
+    state['edges'].pop(rev, None)
     yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
 
 def _fixlongrightedges(edges):
@@ -426,27 +431,28 @@ 
             edges[i] = (start, end + 1)
 
 def _getnodelineedgestail(
-        node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail):
-    if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0:
+        echars, idx, pidx, ncols, coldiff, pdiff, fix_tail):
+    if fix_tail and coldiff == pdiff and coldiff != 0:
         # Still going in the same non-vertical direction.
-        if n_columns_diff == -1:
-            start = max(node_index + 1, p_node_index)
-            tail = ["|", " "] * (start - node_index - 1)
-            tail.extend(["/", " "] * (n_columns - start))
+        if coldiff == -1:
+            start = max(idx + 1, pidx)
+            tail = echars[idx * 2:(start - 1) * 2]
+            tail.extend(["/", " "] * (ncols - start))
             return tail
         else:
-            return ["\\", " "] * (n_columns - node_index - 1)
+            return ["\\", " "] * (ncols - idx - 1)
     else:
-        return ["|", " "] * (n_columns - node_index - 1)
+        remainder = (ncols - idx - 1)
+        return echars[-(remainder * 2):] if remainder > 0 else []
 
-def _drawedges(edges, nodeline, interline):
+def _drawedges(echars, edges, nodeline, interline):
     for (start, end) in edges:
         if start == end + 1:
             interline[2 * end + 1] = "/"
         elif start == end - 1:
             interline[2 * start + 1] = "\\"
         elif start == end:
-            interline[2 * start] = "|"
+            interline[2 * start] = echars[2 * start]
         else:
             if 2 * end >= len(nodeline):
                 continue
@@ -457,26 +463,29 @@ 
                 if nodeline[i] != "+":
                     nodeline[i] = "-"
 
-def _getpaddingline(ni, n_columns, edges):
-    line = []
-    line.extend(["|", " "] * ni)
-    if (ni, ni - 1) in edges or (ni, ni) in edges:
-        # (ni, ni - 1)      (ni, ni)
+def _getpaddingline(echars, idx, ncols, edges):
+    # all edges up to the current node
+    line = echars[:idx * 2]
+    # an edge for the current node, if there is one
+    if (idx, idx - 1) in edges or (idx, idx) in edges:
+        # (idx, idx - 1)      (idx, idx)
         # | | | |           | | | |
         # +---o |           | o---+
-        # | | c |           | c | |
+        # | | X |           | X | |
         # | |/ /            | |/ /
         # | | |             | | |
-        c = "|"
+        line.extend(echars[idx * 2:(idx + 1) * 2])
     else:
-        c = " "
-    line.extend([c, " "])
-    line.extend(["|", " "] * (n_columns - ni - 1))
+        line.extend('  ')
+    # all edges to the right of the current node
+    remainder = ncols - idx - 1
+    if remainder > 0:
+        line.extend(echars[-(remainder * 2):])
     return line
 
 def asciistate():
     """returns the initial value for the "state" argument to ascii()"""
-    return {'seen': [], 'lastcoldiff': 0, 'lastindex': 0}
+    return {'seen': [], 'edges': {}, 'lastcoldiff': 0, 'lastindex': 0}
 
 def ascii(ui, state, type, char, text, coldata):
     """prints an ASCII graph of the DAG
@@ -498,9 +507,15 @@ 
         in the current revision. That is: -1 means one column removed;
         0 means no columns added or removed; 1 means one column added.
     """
-
     idx, edges, ncols, coldiff = coldata
     assert -2 < coldiff < 2
+
+    edgemap, seen = state['edges'], state['seen']
+    # Be tolerant of history issues; make sure we have at least ncols + coldiff
+    # elements to work with. See test-glog.t for broken history test cases.
+    echars = [c for p in seen for c in (edgemap.get(p, '|'), ' ')]
+    echars.extend(('|', ' ') * max(ncols + coldiff - len(seen), 0))
+
     if coldiff == -1:
         # Transform
         #
@@ -530,35 +545,33 @@ 
     fix_nodeline_tail = len(text) <= 2 and not add_padding_line
 
     # nodeline is the line containing the node character (typically o)
-    nodeline = ["|", " "] * idx
+    nodeline = echars[:idx * 2]
     nodeline.extend([char, " "])
 
     nodeline.extend(
-        _getnodelineedgestail(idx, state['lastindex'], ncols, coldiff,
-                              state['lastcoldiff'], fix_nodeline_tail))
+        _getnodelineedgestail(
+            echars, idx, state['lastindex'], ncols, coldiff,
+            state['lastcoldiff'], fix_nodeline_tail))
 
     # shift_interline is the line containing the non-vertical
     # edges between this entry and the next
-    shift_interline = ["|", " "] * idx
+    shift_interline = echars[:idx * 2]
+    shift_interline.extend(' ' * (2 + coldiff))
+    count = ncols - idx - 1
     if coldiff == -1:
-        n_spaces = 1
-        edge_ch = "/"
+        shift_interline.extend('/ ' * count)
     elif coldiff == 0:
-        n_spaces = 2
-        edge_ch = "|"
+        shift_interline.extend(echars[(idx + 1) * 2:ncols * 2])
     else:
-        n_spaces = 3
-        edge_ch = "\\"
-    shift_interline.extend(n_spaces * [" "])
-    shift_interline.extend([edge_ch, " "] * (ncols - idx - 1))
+        shift_interline.extend(r'\ ' * count)
 
     # draw edges from the current node to its parents
-    _drawedges(edges, nodeline, shift_interline)
+    _drawedges(echars, edges, nodeline, shift_interline)
 
     # lines is the list of all graph lines to print
     lines = [nodeline]
     if add_padding_line:
-        lines.append(_getpaddingline(idx, ncols, edges))
+        lines.append(_getpaddingline(echars, idx, ncols, edges))
     lines.append(shift_interline)
 
     # make sure that there are as many graph lines as there are
@@ -566,7 +579,7 @@ 
     while len(text) < len(lines):
         text.append("")
     if len(lines) < len(text):
-        extra_interline = ["|", " "] * (ncols + coldiff)
+        extra_interline = echars[:(ncols + coldiff) * 2]
         while len(lines) < len(text):
             lines.append(extra_interline)
 
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,7 @@ 
   | 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-copy-move-merge.t b/tests/test-copy-move-merge.t
--- a/tests/test-copy-move-merge.t
+++ b/tests/test-copy-move-merge.t
@@ -156,11 +156,11 @@ 
 
   $ hg log -G -f b
   @  changeset:   3:76024fb4b05b
-  |  tag:         tip
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     copy a->b (2)
-  |
+  :  tag:         tip
+  :  user:        test
+  :  date:        Thu Jan 01 00:00:00 1970 +0000
+  :  summary:     copy a->b (2)
+  :
   o  changeset:   0:ac82d8b1f7c4
      user:        test
      date:        Thu Jan 01 00:00:00 1970 +0000
diff --git a/tests/test-glog-topological.t b/tests/test-glog-topological.t
--- a/tests/test-glog-topological.t
+++ b/tests/test-glog-topological.t
@@ -66,11 +66,11 @@ 
   o  8
   |
   o  3
-  |
+  :
   o  1
   |
   | o  7
-  | |
+  | :
   | o  5
   | |
   | o  4
diff --git a/tests/test-glog.t b/tests/test-glog.t
--- a/tests/test-glog.t
+++ b/tests/test-glog.t
@@ -940,193 +940,193 @@ 
   $ hg log -G -r 'file("a")' -m
   o    changeset:   32:d06dffa21a31
   |\   parent:      27:886ed638191b
-  | |  parent:      31:621d83e11f67
-  | |  user:        test
-  | |  date:        Thu Jan 01 00:00:32 1970 +0000
-  | |  summary:     (32) expand
-  | |
-  o |  changeset:   31:621d83e11f67
-  |\|  parent:      21:d42a756af44d
-  | |  parent:      30:6e11cd4b648f
-  | |  user:        test
-  | |  date:        Thu Jan 01 00:00:31 1970 +0000
-  | |  summary:     (31) expand
-  | |
-  o |    changeset:   30:6e11cd4b648f
+  | :  parent:      31:621d83e11f67
+  | :  user:        test
+  | :  date:        Thu Jan 01 00:00:32 1970 +0000
+  | :  summary:     (32) expand
+  | :
+  o :  changeset:   31:621d83e11f67
+  |\:  parent:      21:d42a756af44d
+  | :  parent:      30:6e11cd4b648f
+  | :  user:        test
+  | :  date:        Thu Jan 01 00:00:31 1970 +0000
+  | :  summary:     (31) expand
+  | :
+  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:      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:      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
-  | | | | |
+  | | . . :  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:      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
-  | | | | | |
+  | | . . . :  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:      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
-  | | | | | |
+  | . . . :    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
-  | | | | | |
+  | . . . |    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:      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
-  | | | | | |
+  . . . | |    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
-  | | | | | |
+  . . . | |    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
-  | | | | | |
+  . . . | |/   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
-  | | | | | |
+  . . . | |/   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:      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 +1139,20 @@ 
 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 +1176,10 @@ 
   |  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
@@ -1277,17 +1277,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 +1298,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 +1368,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 +1408,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 +1796,8 @@ 
   $ 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 +1875,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 +1939,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 +2384,7 @@ 
   o  2147483647:ffffffffffff
   |
   @  3:5918b8d165d1
-  |
+  .
 
 node template with changeset_printer:
 
@@ -2393,8 +2393,8 @@ 
   |
   6    6:fc281d8ff18d
   |\
-  5 |  5:99b31f1c2782
-  | |
+  5 .  5:99b31f1c2782
+  . .
 
 node template with changeset_templater (shared cache variable):
 
@@ -2404,7 +2404,7 @@ 
   |
   #    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,7 @@ 
   o  3 c8e6 four
   |
   o  2 eb57 three
-  |
+  .
   $ HGEDITOR=cat hg histedit -r 4 --commands - << EOF
   > edit 08d98a8350f3 4 five
   > EOF
@@ -151,7 +151,7 @@ 
   | 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,7 @@ 
   $ 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 +498,7 @@ 
   $ 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 +533,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,7 @@ 
   7:daea875e9014
   $ hg log -Gqf sub2/large7
   @  7:daea875e9014
-  |
+  .
   $ cd ..
 
 Test log from outside repo
@@ -1285,13 +1285,13 @@ 
   4:74c02385b94c  move files
   $ hg log -G --template '{rev}:{node|short}  {desc|firstline}\n' .hglf/sub/large4
   o  8:a381d2c8c80e  modify normal file and largefile in repo b
-  |
+  :
   o  6:4355d653f84f  edit files yet again
   |
   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
@@ -1299,13 +1299,13 @@ 
   4:74c02385b94c  move files
   $ hg log -G --template '{rev}:{node|short}  {desc|firstline}\n' .hglf/sub/large4
   o  8:a381d2c8c80e  modify normal file and largefile in repo b
-  |
+  :
   o  6:4355d653f84f  edit files yet again
   |
   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
@@ -1317,13 +1317,13 @@ 
   0:30d30fe6a5be  add files
   $ hg log -G --template '{rev}:{node|short}  {desc|firstline}\n' .hglf/sub
   o  8:a381d2c8c80e  modify normal file and largefile in repo b
-  |
+  :
   o  6:4355d653f84f  edit files yet again
   |
   o  5:9d5af5072dbd  edit files again
   |
   o  4:74c02385b94c  move files
-  |
+  :
   o  1:ce8896473775  edit files
   |
   o  0:30d30fe6a5be  add files
@@ -1340,13 +1340,13 @@ 
   @  9:598410d3eb9a  modify normal file largefile in repo d
   |
   o  8:a381d2c8c80e  modify normal file and largefile in repo b
-  |
+  :
   o  6:4355d653f84f  edit files yet again
   |
   o  5:9d5af5072dbd  edit files again
   |
   o  4:74c02385b94c  move files
-  |
+  :
   o  1:ce8896473775  edit files
   |
   o  0:30d30fe6a5be  add files
@@ -1364,13 +1364,13 @@ 
   @  9:598410d3eb9a  modify normal file largefile in repo d
   |
   o  8:a381d2c8c80e  modify normal file and largefile in repo b
-  |
+  :
   o  6:4355d653f84f  edit files yet again
   |
   o  5:9d5af5072dbd  edit files again
   |
   o  4:74c02385b94c  move files
-  |
+  :
   o  1:ce8896473775  edit files
   |
   o  0:30d30fe6a5be  add files
diff --git a/tests/test-log.t b/tests/test-log.t
--- a/tests/test-log.t
+++ b/tests/test-log.t
@@ -1970,10 +1970,10 @@ 
   |  summary:     content3
   |
   o  changeset:   3:15b2327059e5
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     content2
-  |
+  :  user:        test
+  :  date:        Thu Jan 01 00:00:00 1970 +0000
+  :  summary:     content2
+  :
   o  changeset:   0:ae0a3c9f9e95
      user:        test
      date:        Thu Jan 01 00:00:00 1970 +0000
@@ -1985,16 +1985,16 @@ 
 
   $ hg log -G a
   @  changeset:   4:50b9b36e9c5d
-  |  tag:         tip
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     content3
-  |
-  | o  changeset:   1:2294ae80ad84
-  |/   user:        test
-  |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    summary:     content2
-  |
+  :  tag:         tip
+  :  user:        test
+  :  date:        Thu Jan 01 00:00:00 1970 +0000
+  :  summary:     content3
+  :
+  : o  changeset:   1:2294ae80ad84
+  :/   user:        test
+  :    date:        Thu Jan 01 00:00:00 1970 +0000
+  :    summary:     content2
+  :
   o  changeset:   0:ae0a3c9f9e95
      user:        test
      date:        Thu Jan 01 00:00:00 1970 +0000
@@ -2008,10 +2008,10 @@ 
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg log -Gf a
   @  changeset:   3:15b2327059e5
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     content2
-  |
+  :  user:        test
+  :  date:        Thu Jan 01 00:00:00 1970 +0000
+  :  summary:     content2
+  :
   o  changeset:   0:ae0a3c9f9e95
      user:        test
      date:        Thu Jan 01 00:00:00 1970 +0000
@@ -2059,10 +2059,10 @@ 
   |  summary:     content3
   |
   @  changeset:   3:15b2327059e5
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     content2
-  |
+  :  user:        test
+  :  date:        Thu Jan 01 00:00:00 1970 +0000
+  :  summary:     content2
+  :
   o  changeset:   0:ae0a3c9f9e95
      user:        test
      date:        Thu Jan 01 00:00:00 1970 +0000
@@ -2076,11 +2076,11 @@ 
   $ hg debugobsolete 50b9b36e9c5df2c6fc6dcefa8ad0da929e84aed2
   $ hg log -G a
   @  changeset:   3:15b2327059e5
-  |  tag:         tip
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     content2
-  |
+  :  tag:         tip
+  :  user:        test
+  :  date:        Thu Jan 01 00:00:00 1970 +0000
+  :  summary:     content2
+  :
   o  changeset:   0:ae0a3c9f9e95
      user:        test
      date:        Thu Jan 01 00:00:00 1970 +0000
@@ -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,7 @@ 
 
   $ hg tglog -l 1
   @  2: 'R1'
-  |
+  .
 
 pull --rebase --update should ignore --update:
 
@@ -111,7 +111,7 @@ 
 
   $ hg tglog -l 1
   o  2: 'R1'
-  |
+  .
 
   $ cd ..
 
diff --git a/tests/test-rebase-rename.t b/tests/test-rebase-rename.t
--- a/tests/test-rebase-rename.t
+++ b/tests/test-rebase-rename.t
@@ -298,7 +298,7 @@ 
   o  3: 'File c created as copy of b and modified'
   |
   o  2: 'File b created as copy of a and modified'
-  |
+  :
   o  0: 'File a created'
   
 Same steps as above, but with --collapse on rebase to make sure the
@@ -323,9 +323,9 @@ 
 
   $ hg tglog --follow d
   @  3: 'Collapsed revision
-  |  * File b created as copy of a and modified
-  |  * File c created as copy of b and modified
-  |  * File d created as copy of c and modified'
+  :  * File b created as copy of a and modified
+  :  * File c created as copy of b and modified
+  :  * File d created as copy of c and modified'
   o  0: 'File a created'
   
 
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,7 @@ 
   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
   |