changeset 2950:1b4c92621e23

doc: integrate graphviz graphs in tutorials Use the mercurial-graphviz extension (https://bitbucket.org/octobus/mercurial_graphviz) in tutorials in order to have some dot graphs in the tutorials .t files. In order to run the tests, export the GRAPHVIZ_EXTENSION variable which points to your copy of the extension. Please be aware that pygraphviz should be installed in your environment. That should be sufficient for generating dot graphs in text format. Then generate the doc as usual, the sphinx-graphviz extension (http://www .sphinx-doc.org/en/stable/ext/graphviz.html) has been added and it should handle the generation of the graphs. Please be aware that you need the dot binary installed in your system. Please refer to the extension documentation for more configuration.
author Boris Feld <boris.feld@octobus.net>
date Tue, 29 Aug 2017 16:42:40 +0200
parents 9345b2eeeef3
children 2ddc63d13af8
files docs/conf.py docs/test2rst.py tests/test-topic-tutorial.t tests/test-tutorial.t tests/testlib/graphviz_setup.sh
diffstat 5 files changed, 1765 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/docs/conf.py	Tue Sep 19 12:52:22 2017 +0200
+++ b/docs/conf.py	Tue Aug 29 16:42:40 2017 +0200
@@ -1,6 +1,6 @@
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = []
+extensions = ["sphinx.ext.graphviz"]
 # autoclass_content = 'both'
 # Add any paths that contain templates here, relative to this directory.
 # templates_path = []
@@ -122,3 +122,6 @@
 
 # Output file base name for HTML help builder.
 # htmlhelp_basename = ''
+
+
+graphviz_output_format = "svg"
--- a/docs/test2rst.py	Tue Sep 19 12:52:22 2017 +0200
+++ b/docs/test2rst.py	Tue Aug 29 16:42:40 2017 +0200
@@ -17,22 +17,38 @@
     newlines = []
 
     code_block_mode = False
+    sphinx_directive_mode = False
 
     for line in orig.splitlines():
 
         # Emtpy lines doesn't change output
         if not line:
             newlines.append(line)
+            code_block_mode = False
+            sphinx_directive_mode = False
+            continue
+
+        # Ignore line
+        if line.endswith('#ignore'):
             continue
 
+        # Sphinx directives mode
+        if line.startswith('  .. '):
+
+            # Insert a empty line to makes sphinx happy
+            newlines.append("")
+
+            # And unindent the directive
+            line = line[2:]
+            sphinx_directive_mode = True
+
+        # Code mode
         codeline = line.startswith('  ')
-        if codeline:
+        if codeline and not sphinx_directive_mode:
             if code_block_mode is False:
                 newlines.extend(['::', ''])
 
             code_block_mode = True
-        else:
-            code_block_mode = False
 
         newlines.append(line)
 
--- a/tests/test-topic-tutorial.t	Tue Sep 19 12:52:22 2017 +0200
+++ b/tests/test-topic-tutorial.t	Tue Aug 29 16:42:40 2017 +0200
@@ -45,6 +45,7 @@
   > [ui]
   > user= Tutorial User
   > EOF
+  $ . "$TESTDIR/testlib/graphviz_setup.sh" #ignore
 
 Topic branches are lightweight branches which disappear when changes are
 finalized (moved to the public phase). They can help users to organize and share
@@ -62,6 +63,25 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     Shopping list
   
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 38da43f0a2ea",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      }
 
 We are about to make some additions to this list and would like to do them
 within a topic. Creating a new topic is done using the ``topic`` command:
@@ -90,6 +110,26 @@
      summary:     Shopping list
   
 
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 38da43f0a2ea",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      }
+
 Our next commit will be part of the active topic:
 
   $ cat >> shopping << EOF
@@ -110,6 +150,26 @@
      summary:     adding condiments
   
 
+  $ hg graphviz -r "topic("food")" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	1	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="1: 13900241408b",
+      		pin=true,
+      		pos="1,1!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      }
+
 And future commits will be part of that topic too:
 
   $ cat >> shopping << EOF
@@ -135,6 +195,37 @@
      summary:     adding condiments
   
 
+  $ hg graphviz -r "topic("food")" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	1	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="1: 13900241408b",
+      		pin=true,
+      		pos="1,1!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	2	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="2: 287de11b401f",
+      		pin=true,
+      		pos="1,2!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	1 -> 2;
+      }
+
 We can get a compact view of the content of our topic using the ``stack``
 command:
 
@@ -175,6 +266,48 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     Shopping list
   
+
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 38da43f0a2ea",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	1	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="1: 13900241408b",
+      		pin=true,
+      		pos="1,1!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	0 -> 1;
+      	2	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="2: 287de11b401f",
+      		pin=true,
+      		pos="1,2!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	1 -> 2;
+      }
 And updating back to the topic reactivates it:
 
   $ hg update food
@@ -253,6 +386,58 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     Shopping list
   
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 38da43f0a2ea",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	1	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="1: 13900241408b",
+      		pin=true,
+      		pos="1,1!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	0 -> 1;
+      	3	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="3: 6104862e8b84",
+      		pin=true,
+      		pos="1,3!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 3;
+      	2	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="2: 287de11b401f",
+      		pin=true,
+      		pos="1,2!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	1 -> 2;
+      }
 
 The topic head will not be considered when merging from the new head of the
 branch:
@@ -303,6 +488,58 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     Shopping list
   
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 38da43f0a2ea",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	3	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="3: 6104862e8b84",
+      		pin=true,
+      		pos="1,3!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 3;
+      	4	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="4: 4011b46eeb33",
+      		pin=true,
+      		pos="1,4!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	3 -> 4;
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 2d50db8b5b4c",
+      		pin=true,
+      		pos="1,5!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	4 -> 5;
+      }
 
 The topic information will disappear when we publish the changesets:
 
@@ -344,6 +581,59 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     Shopping list
   
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 38da43f0a2ea",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	3	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="3: 6104862e8b84",
+      		pin=true,
+      		pos="1,3!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 3;
+      	4	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="4: 4011b46eeb33",
+      		pin=true,
+      		pos="1,4!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	3 -> 4;
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 2d50db8b5b4c",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	4 -> 5;
+      }
+
   $ hg update default
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -510,6 +800,136 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     Shopping list
   
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 38da43f0a2ea",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	3	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="3: 6104862e8b84",
+      		pin=true,
+      		pos="1,3!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 3;
+      	4	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="4: 4011b46eeb33",
+      		pin=true,
+      		pos="1,4!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	3 -> 4;
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 2d50db8b5b4c",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	4 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: 183984ef46d1",
+      		pin=true,
+      		pos="1,6!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	9	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="9: 8dfa45bd5e0c",
+      		pin=true,
+      		pos="1,9!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	5 -> 9;
+      	11	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="11: f2d6cacc6115",
+      		pin=true,
+      		pos="1,11!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5 -> 11;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: cffff85af537",
+      		pin=true,
+      		pos="1,7!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      	8	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="8: 34255b455dac",
+      		pin=true,
+      		pos="1,8!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	7 -> 8;
+      	10	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="10: 70dfa201ed73",
+      		pin=true,
+      		pos="1,10!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	9 -> 10;
+      	12	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="12: fbff9bc37a43",
+      		pin=true,
+      		pos="1,12!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	11 -> 12;
+      }
+
   $ hg rebase
   rebasing 6:183984ef46d1 "Adding hammer"
   merging shopping
@@ -708,6 +1128,97 @@
   ~  date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     add a pair of shoes
   
+
+  $ hg graphviz -r "t0::" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	12	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="12: fbff9bc37a43",
+      		pin=true,
+      		pos="1,12!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	13	 [fillcolor="#DFDFFF",
+      		fixedsize=true,
+      		group=default_alt,
+      		height=2,
+      		label="13: a8ab3599d53d",
+      		pin=true,
+      		pos="2,13!",
+      		shape=pentagon,
+      		style="dotted, filled",
+      		width=2];
+      	12 -> 13;
+      	18	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="18: b7509bd417f8",
+      		pin=true,
+      		pos="1,18!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	12 -> 18;
+      	16	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="16: 20759cb47ff8",
+      		pin=true,
+      		pos="1,16!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	12 -> 16;
+      	13 -> 18	 [arrowtail=dot,
+      		dir=back,
+      		minlen=0,
+      		style=dotted];
+      	14	 [fillcolor="#FF3535",
+      		fixedsize=true,
+      		group=default_alt,
+      		height=2,
+      		label="14: d4f97f32f8a1",
+      		pin=true,
+      		pos="2,14!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	13 -> 14;
+      	15	 [fillcolor="#FF3535",
+      		fixedsize=true,
+      		group=default_alt,
+      		height=2,
+      		label="15: bb1e6254f532",
+      		pin=true,
+      		pos="2,15!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	14 -> 15;
+      	17	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="17: 4cd7c1591a67",
+      		pin=true,
+      		pos="1,17!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	16 -> 17;
+      }
+
 Fortunately stack shows you a better visualization:
 
   $ hg stack
@@ -787,6 +1298,81 @@
   ~  date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     add a pair of shoes
   
+
+  $ hg graphviz -r "t0::" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	12	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="12: fbff9bc37a43",
+      		pin=true,
+      		pos="1,12!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	16	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="16: 20759cb47ff8",
+      		pin=true,
+      		pos="1,16!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	12 -> 16;
+      	18	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="18: b7509bd417f8",
+      		pin=true,
+      		pos="1,18!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	12 -> 18;
+      	17	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="17: 4cd7c1591a67",
+      		pin=true,
+      		pos="1,17!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	16 -> 17;
+      	19	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="19: d5c51ee5762a",
+      		pin=true,
+      		pos="1,19!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	18 -> 19;
+      	20	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="20: bae3758e46bf",
+      		pin=true,
+      		pos="1,20!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	19 -> 20;
+      }
 Multi-headed stack
 ------------------
 
@@ -887,6 +1473,147 @@
      summary:     Shopping list
   
 
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 38da43f0a2ea",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	3	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="3: 6104862e8b84",
+      		pin=true,
+      		pos="1,3!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 3;
+      	4	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="4: 4011b46eeb33",
+      		pin=true,
+      		pos="1,4!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	3 -> 4;
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 2d50db8b5b4c",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	4 -> 5;
+      	11	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="11: f2d6cacc6115",
+      		pin=true,
+      		pos="1,11!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5 -> 11;
+      	12	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="12: fbff9bc37a43",
+      		pin=true,
+      		pos="1,12!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	11 -> 12;
+      	16	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="16: 20759cb47ff8",
+      		pin=true,
+      		pos="1,16!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	12 -> 16;
+      	18	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="18: b7509bd417f8",
+      		pin=true,
+      		pos="1,18!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	12 -> 18;
+      	17	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="17: 4cd7c1591a67",
+      		pin=true,
+      		pos="1,17!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	16 -> 17;
+      	19	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="19: d5c51ee5762a",
+      		pin=true,
+      		pos="1,19!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	18 -> 19;
+      	21	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="21: f936c6da9d61",
+      		pin=true,
+      		pos="1,21!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	18 -> 21;
+      	20	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="20: bae3758e46bf",
+      		pin=true,
+      		pos="1,20!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	19 -> 20;
+      }
+
   $ hg up t4
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
--- a/tests/test-tutorial.t	Tue Sep 19 12:52:22 2017 +0200
+++ b/tests/test-tutorial.t	Tue Aug 29 16:42:40 2017 +0200
@@ -65,6 +65,8 @@
   > rebase =
   > EOF
 
+  $ . "$TESTDIR/testlib/graphviz_setup.sh" #ignore
+
 -----------------------
 Single Developer Usage
 -----------------------
@@ -125,6 +127,47 @@
   |
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	1	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="1: 4d5dc8187023",
+      		pin=true,
+      		pos="1,1!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	0 -> 1;
+      	2	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="2: d85de4546133",
+      		pin=true,
+      		pos="1,2!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	1 -> 2;
+      }
 
 But a typo was made in Babanas!
 
@@ -159,6 +202,48 @@
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
 
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	1	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="1: 4d5dc8187023",
+      		pin=true,
+      		pos="1,1!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	0 -> 1;
+      	2	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="2: d85de4546133",
+      		pin=true,
+      		pos="1,2!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	1 -> 2;
+      }
+
 Hopefully. I can use `hg commit --amend` to rewrite my faulty changeset!
 
   $ sed -i'' -e s/Bananos/Banana/ shopping
@@ -185,6 +270,48 @@
   |
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	1	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="1: 4d5dc8187023",
+      		pin=true,
+      		pos="1,1!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	0 -> 1;
+      	4	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="4: 9d0363b81950",
+      		pin=true,
+      		pos="1,4!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	1 -> 4;
+      }
+
   $ hg export tip
   # HG changeset patch
   # User test
@@ -239,6 +366,59 @@
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
 
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	1	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="1: 4d5dc8187023",
+      		pin=true,
+      		pos="1,1!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	0 -> 1;
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	4	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="4: 9d0363b81950",
+      		pin=true,
+      		pos="1,4!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	1 -> 4;
+      }
+
 Instead of merging my head with the new one. I'm going to rebase my work
 
   $ hg diff
@@ -260,6 +440,58 @@
   |
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: dfd3a2d7691e",
+      		pin=true,
+      		pos="1,6!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: 41aff6a42b75",
+      		pin=true,
+      		pos="1,7!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      }
 
 Removing changesets
 ------------------------
@@ -305,6 +537,59 @@
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
 
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: dfd3a2d7691e",
+      		pin=true,
+      		pos="1,6!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: 41aff6a42b75",
+      		pin=true,
+      		pos="1,7!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      }
+
 Reordering changesets
 ------------------------
 
@@ -367,6 +652,81 @@
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
 
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: dfd3a2d7691e",
+      		pin=true,
+      		pos="1,6!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: 41aff6a42b75",
+      		pin=true,
+      		pos="1,7!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      	9	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="9: 10b8aeaa8cc8",
+      		pin=true,
+      		pos="1,9!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	7 -> 9;
+      	11	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="11: a224f2a4fb9f",
+      		pin=true,
+      		pos="1,11!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	7 -> 11;
+      }
+
 We have a new SPAM SPAM version without the bathroom stuff
 
   $ grep Spam shopping  # enough spam
@@ -429,7 +789,80 @@
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
 
-
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: dfd3a2d7691e",
+      		pin=true,
+      		pos="1,6!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: 41aff6a42b75",
+      		pin=true,
+      		pos="1,7!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      	11	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="11: a224f2a4fb9f",
+      		pin=true,
+      		pos="1,11!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	7 -> 11;
+      	12	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="12: 75954b8cd933",
+      		pin=true,
+      		pos="1,12!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	11 -> 12;
+      }
 
 Splitting change
 ------------------
@@ -640,6 +1073,81 @@
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
 
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: dfd3a2d7691e",
+      		pin=true,
+      		pos="1,6!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: 41aff6a42b75",
+      		pin=true,
+      		pos="1,7!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      	11	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="11: a224f2a4fb9f",
+      		pin=true,
+      		pos="1,11!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	7 -> 11;
+      	14	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="14: a44c85f957d3",
+      		pin=true,
+      		pos="1,14!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	11 -> 14;
+      }
+
 When we pull from remote again we get an unstable state!
 
   $ hg pull remote
@@ -674,6 +1182,107 @@
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
 
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: dfd3a2d7691e",
+      		pin=true,
+      		pos="1,6!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: 41aff6a42b75",
+      		pin=true,
+      		pos="1,7!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      	11	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="11: a224f2a4fb9f",
+      		pin=true,
+      		pos="1,11!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	7 -> 11;
+      	12	 [fillcolor="#DFDFFF",
+      		fixedsize=true,
+      		group=default_alt,
+      		height=2,
+      		label="12: 75954b8cd933",
+      		pin=true,
+      		pos="2,12!",
+      		shape=pentagon,
+      		style="dotted, filled",
+      		width=2];
+      	11 -> 12;
+      	14	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="14: a44c85f957d3",
+      		pin=true,
+      		pos="1,14!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	11 -> 14;
+      	12 -> 14	 [arrowtail=dot,
+      		dir=back,
+      		minlen=0,
+      		style=dotted];
+      	15	 [fillcolor="#FF3535",
+      		fixedsize=true,
+      		group=default_alt,
+      		height=2,
+      		label="15: bf1b0d202029",
+      		pin=true,
+      		pos="2,15!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	12 -> 15;
+      }
+
 The older version 75954b8cd933 never ceased to exist in the local repo. It was
 just hidden and excluded from pull and push.
 
@@ -726,6 +1335,92 @@
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
 
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: dfd3a2d7691e",
+      		pin=true,
+      		pos="1,6!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: 41aff6a42b75",
+      		pin=true,
+      		pos="1,7!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      	11	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="11: a224f2a4fb9f",
+      		pin=true,
+      		pos="1,11!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	7 -> 11;
+      	14	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="14: a44c85f957d3",
+      		pin=true,
+      		pos="1,14!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	11 -> 14;
+      	16	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="16: ee942144f952",
+      		pin=true,
+      		pos="1,16!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	14 -> 16;
+      }
+
 We can push this evolution to remote.
 
   $ hg push remote
@@ -797,6 +1492,103 @@
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
 
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: dfd3a2d7691e",
+      		pin=true,
+      		pos="1,6!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: 41aff6a42b75",
+      		pin=true,
+      		pos="1,7!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      	11	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="11: a224f2a4fb9f",
+      		pin=true,
+      		pos="1,11!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	7 -> 11;
+      	14	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="14: a44c85f957d3",
+      		pin=true,
+      		pos="1,14!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	11 -> 14;
+      	16	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="16: ee942144f952",
+      		pin=true,
+      		pos="1,16!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	14 -> 16;
+      	17	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="17: 99f039c5ec9e",
+      		pin=true,
+      		pos="1,17!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	16 -> 17;
+      }
+
 In the mean time I noticed you can't buy animals in a super market and I prune the animal changeset:
 
   $ hg prune ee942144f952
@@ -826,9 +1618,127 @@
   |
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
+
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: dfd3a2d7691e",
+      		pin=true,
+      		pos="1,6!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: 41aff6a42b75",
+      		pin=true,
+      		pos="1,7!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      	11	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="11: a224f2a4fb9f",
+      		pin=true,
+      		pos="1,11!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	7 -> 11;
+      	14	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="14: a44c85f957d3",
+      		pin=true,
+      		pos="1,14!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	11 -> 14;
+      	16	 [fillcolor="#DFDFFF",
+      		fixedsize=true,
+      		group=default_alt,
+      		height=2,
+      		label="16: ee942144f952",
+      		pin=true,
+      		pos="2,16!",
+      		shape=pentagon,
+      		style="dotted, filled",
+      		width=2];
+      	14 -> 16;
+      	17	 [fillcolor="#FF3535",
+      		fixedsize=true,
+      		group=default_alt,
+      		height=2,
+      		label="17: 99f039c5ec9e",
+      		pin=true,
+      		pos="2,17!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	16 -> 17;
+      }
+
   $ hg log -r "orphan()"
   99f039c5ec9e (draft): SPAM SPAM SPAM
 
+  $ hg graphviz -r "orphan()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	17	 [fillcolor="#FF3535",
+      		fixedsize=true,
+      		group=default_alt,
+      		height=2,
+      		label="17: 99f039c5ec9e",
+      		pin=true,
+      		pos="1,17!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      }
+
   $ hg evolve
   move:[15] SPAM SPAM SPAM
   atop:[12] bathroom stuff
@@ -850,6 +1760,93 @@
   |
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
+
+  $ hg graphviz -r "all()" --sphinx-directive --rankdir LR #ignore
+  .. graphviz::
+  
+      strict digraph  {
+      	graph [rankdir=LR,
+      		splines=polyline
+      	];
+      	node [label="\N"];
+      	0	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="0: 7e82d3f3c2cb",
+      		pin=true,
+      		pos="1,0!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="5: 9ca060c80d74",
+      		pin=true,
+      		pos="1,5!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	0 -> 5;
+      	6	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="6: dfd3a2d7691e",
+      		pin=true,
+      		pos="1,6!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	5 -> 6;
+      	7	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="7: 41aff6a42b75",
+      		pin=true,
+      		pos="1,7!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	6 -> 7;
+      	11	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="11: a224f2a4fb9f",
+      		pin=true,
+      		pos="1,11!",
+      		shape=circle,
+      		style=filled,
+      		width=2];
+      	7 -> 11;
+      	14	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="14: a44c85f957d3",
+      		pin=true,
+      		pos="1,14!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	11 -> 14;
+      	18	 [fillcolor="#7F7FFF",
+      		fixedsize=true,
+      		group=default,
+      		height=2,
+      		label="18: 40aa40daeefb",
+      		pin=true,
+      		pos="1,18!",
+      		shape=pentagon,
+      		style=filled,
+      		width=2];
+      	14 -> 18;
+      }
+
 Handling Divergent amend
 ----------------------------------------------
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/testlib/graphviz_setup.sh	Tue Aug 29 16:42:40 2017 +0200
@@ -0,0 +1,17 @@
+. $TESTDIR/testlib/pythonpath.sh
+
+if ! test -z "${GRAPHVIZ_EXTENSION}"; then
+
+cat >> $HGRCPATH << EOF
+[extensions]
+graphviz=${GRAPHVIZ_EXTENSION}/hgext3rd/graphviz.py
+EOF
+
+else
+
+cat >> $HGRCPATH << EOF
+[alias]
+graphviz=log -r "0" -Tt
+EOF
+
+fi