test-compat: merge mercurial-4.7 into mercurial-4.6 mercurial-4.6
authorPierre-Yves David <pierre-yves.david@octobus.net>
Thu, 28 Nov 2019 10:54:04 +0100
branchmercurial-4.6
changeset 4972 7dbc0cf62a0b
parent 4887 5fb90a0d2183 (current diff)
parent 4971 9f69164cdc16 (diff)
child 4978 777a352d2ade
test-compat: merge mercurial-4.7 into mercurial-4.6
tests/test-discovery-obshashrange.t
tests/test-evolve-templates.t
tests/test-obsolete.t
tests/test-topic.t
--- a/.gitlab-ci.yml	Sat Oct 05 13:50:11 2019 -0400
+++ b/.gitlab-ci.yml	Thu Nov 28 10:54:04 2019 +0100
@@ -1,12 +1,36 @@
 flake8:
+    image: octobus/ci-py2-hgext3rd
+    script:
+        - hg files -0 'set:(**.py or grep("^#!.*python")) - removed()' -X hgext3rd/evolve/thirdparty | xargs -0 flake8
+
+tests-py2-cext:
+    image: octobus/ci-py2-hgext3rd
     script:
-        - pip install --user flake8
-        - hg files -0 'set:(**.py or grep("^#!.*python")) - removed()' -X hgext3rd/evolve/thirdparty | xargs -0 ~/.local/bin/flake8
-tests:
+        - hg pull -R /ci/repos/mercurial/
+        - hg_rev=$(tests/testlib/map-hg-rev.sh "$(hg log -r . -T '{branch}')")
+        - hg -R /ci/repos/mercurial/ update "$hg_rev"
+        - (cd tests; /ci/repos/mercurial/tests/run-tests.py --color=always)
+
+tests-py2-pure:
+    image: octobus/ci-py2-hgext3rd
     script:
-        - echo $PWD
-        - rm -rf /tmp/mercurial-clone-`hg log -r . -T "{node}"`
-        - hg clone https://mirror.octobus.net/hg/ /tmp/mercurial-clone-`hg log -r . -T "{node}"` --config share.pool=/tmp/
-        - hg -R /tmp/mercurial-clone-`hg log -r . -T "{node}"` update `hg log -r . -T '{branch}'`
-        - (cd tests; /tmp/mercurial-clone-`hg log -r . -T "{node}"`/tests/run-tests.py -j 3)
-        - rm -rf /tmp/mercurial-clone-`hg log -r . -T "{node}"`
+        - hg pull -R /ci/repos/mercurial/
+        - hg_rev=$(tests/testlib/map-hg-rev.sh "$(hg log -r . -T '{branch}')")
+        - hg -R /ci/repos/mercurial/ update "$hg_rev"
+        - (cd tests; /ci/repos/mercurial/tests/run-tests.py --color=always --pure)
+
+tests-py3-cext:
+    image: octobus/ci-py3-hgext3rd
+    script:
+        - hg pull -R /ci/repos/mercurial/
+        - hg_rev=$(tests/testlib/map-hg-rev.sh "$(hg log -r . -T '{branch}')")
+        - hg -R /ci/repos/mercurial/ update "$hg_rev"
+        - (cd tests; python3 /ci/repos/mercurial/tests/run-tests.py --color=always)
+
+tests-py3-pure:
+    image: octobus/ci-py3-hgext3rd
+    script:
+        - hg pull -R /ci/repos/mercurial/
+        - hg_rev=$(tests/testlib/map-hg-rev.sh "$(hg log -r . -T '{branch}')")
+        - hg -R /ci/repos/mercurial/ update "$hg_rev"
+        - (cd tests; python3 /ci/repos/mercurial/tests/run-tests.py --color=always --pure)
--- a/.hgtags	Sat Oct 05 13:50:11 2019 -0400
+++ b/.hgtags	Thu Nov 28 10:54:04 2019 +0100
@@ -82,3 +82,4 @@
 756db65030c64b22836fe236d1db3b95477e3ef7 9.0.0
 6f37fdad7ac123ca0a76872ac4639bd1f3c248f7 9.1.0
 40795751be1c329ec23202ecd79ba45623e1df66 9.2.0
+d989bab720e5f7638a9e58fda76cf3f4b40d0611 9.2.1
--- a/CHANGELOG	Sat Oct 05 13:50:11 2019 -0400
+++ b/CHANGELOG	Thu Nov 28 10:54:04 2019 +0100
@@ -1,6 +1,19 @@
 Changelog
 =========
 
+9.2.2 - in progress
+-------------------
+
+  * pick: don't create any successors when there were no changes (issue6093),
+  * metaedit: don't change commit date by default (issue5994),
+  * rewind: preserve date
+  * py3: fix setup.py --version
+  * py3: fix documentation generation
+  * debian: allow to build with python 3
+  * topic: add more options to command synopsis string
+  * evolve: use more often seen metavariables in command synopsis strings
+  * documentation: update text and add missing figures
+
 9.2.1 -- 2019-10-05
 -------------------
 
--- a/README	Sat Oct 05 13:50:11 2019 -0400
+++ b/README	Thu Nov 28 10:54:04 2019 +0100
@@ -116,16 +116,17 @@
 
 .. _evolution: https://bz.mercurial-scm.org/buglist.cgi?component=evolution&query_format=advanced&resolution=---
 
-You can use the patchbomb extension to send email to `mercurial devel
-<https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel>`_. Please make
-sure to use the evolve-ext flag when doing so. You can use a command like
-this::
+The recommended way is to create Merge Request on
+https://dev.heptapod.net/mercurial/evolve. To do so, create an account and
+request access. You'll then be able to create topic based merge request.
+
+Alternatively, you can use the patchbomb extension to send email to `mercurial
+devel <https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel>`_.
+Please make sure to use the evolve-ext flag when doing so. You can use a
+command like this::
 
     $ hg email --to mercurial-devel@mercurial-scm.org --flag evolve-ext --rev '<your patches>'
 
-Some of development happens on a public bitbucket repository (`evolve-devel`_) using the topic extension.
-
-.. _`evolve-devel`: https://bitbucket.org/octobus/evolve-devel
 
 For guidelines on the patch description, see the `official Mercurial guideline`_.
 
--- a/debian/changelog	Sat Oct 05 13:50:11 2019 -0400
+++ b/debian/changelog	Thu Nov 28 10:54:04 2019 +0100
@@ -1,4 +1,13 @@
-mercurial-evolve (9.2.1-1) UNRELEASED; urgency=medium
+mercurial-evolve (9.2.1-1.1) UNRELEASED; urgency=medium
+
+  * build with pybuild and sphinxdoc
+  * update debhelper compat to 10
+  * build with Python 3, keeping Python 2 build until there exists a mercurial
+    package in Debian built with Python 3
+
+ -- Denis Laxalde <denis.laxalde@logilab.fr>  Tue, 15 Oct 2019 11:41:40 +0200
+
+mercurial-evolve (9.2.1-1) unstable; urgency=medium
 
   * new upstream release
 
--- a/debian/compat	Sat Oct 05 13:50:11 2019 -0400
+++ b/debian/compat	Thu Nov 28 10:54:04 2019 +0100
@@ -1,1 +1,1 @@
-8
+10
--- a/debian/control	Sat Oct 05 13:50:11 2019 -0400
+++ b/debian/control	Thu Nov 28 10:54:04 2019 +0100
@@ -9,20 +9,27 @@
 Build-Depends:
  mercurial (>= 4.5),
  python,
- debhelper (>= 8),
+ python3,
+ debhelper (>= 10),
+ dh-python,
  python-sphinx (>= 1.0.8),
  imagemagick,
  librsvg2-bin,
  wget,
+ sphinx-common,
 X-Python-Version: >= 2.7
+X-Python3-Version: >= 3.6
 Homepage: https://www.mercurial-scm.org/doc/evolution/
 
 Package: mercurial-evolve
 Architecture: all
 Depends:
  ${python:Depends},
+ ${python3:Depends},
  ${misc:Depends},
+ ${sphinxdoc:Depends},
  mercurial (>= 4.5),
+Built-Using: ${sphinxdoc:Built-Using}
 Description: evolve extension for Mercurial
  This package provides the experimental "evolve" extension for the Mercurial
  DVCS.
--- a/debian/rules	Sat Oct 05 13:50:11 2019 -0400
+++ b/debian/rules	Thu Nov 28 10:54:04 2019 +0100
@@ -2,12 +2,14 @@
 #export DH_VERBOSE=1
 
 %:
-	dh $@ --with python2 --buildsystem=python_distutils
+	dh $@ --with python2,python3,sphinxdoc --buildsystem=pybuild
 
+ifeq (,$(filter nodoc, $(DEB_BUILD_OPTIONS)))
 override_dh_auto_build:
 	dh_auto_build
 	# Workaround for Sphinx in Debian Buster defaulting to Python 3
 	SPHINXBUILD="python -m sphinx -bhtml" $(MAKE) -C docs
+endif
 
 hgsrc_defined:
 	# Use "! -z" instead of "-n", because "-n" without arguments is true
@@ -23,6 +25,11 @@
 	find debian -path '*/hgext3rd/__init__.py' -delete
 	dh_python2
 
+override_dh_python3:
+	# avoid conflict with mercurial's own hgext3rd/__init__.py
+	find debian -path '*/hgext3rd/__init__.py' -delete
+	dh_python3
+
 override_dh_auto_clean: clean-docs
 	dh_auto_clean
 	rm -f tests/*.err
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/source/options	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,1 @@
+extend-diff-ignore = "^(contrib/|.gitlab-ci.yml|.hg-format-source|MANIFEST|Makefile|docs/tutorial/.netlify|hgext3rd/evolve/hack/|tests/.testtimes)"
--- a/docs/conf.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/docs/conf.py	Thu Nov 28 10:54:04 2019 +0100
@@ -150,9 +150,9 @@
                 os.pardir, 'hgext3rd', 'evolve'))
         hgext.loadall(u)
         u.pushbuffer()
-        commands.help_(u, self.content[0])
+        commands.help_(u, self.content[0].encode('utf-8'))
         return [
-            nodes.literal_block(text=u.popbuffer())]
+            nodes.literal_block(text=u.popbuffer().decode('utf-8'))]
 
 
 def setup(app):
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg01-ab.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="224pt" height="116pt"
+ viewBox="0.00 0.00 224.00 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-108 0,-108 0,-72 72,-72 72,-108"/>
+<text text-anchor="middle" x="36" y="-86.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-108 144,-108 144,-72 216,-72 216,-108"/>
+<text text-anchor="middle" x="180" y="-86.3" font-family="mono" font-size="14.00" fill="#000000">1:f649</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-90C90.9973,-90 113.9327,-90 133.8329,-90"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-93.5001 143.924,-90 133.924,-86.5001 133.9241,-93.5001"/>
+</g>
+<!-- T0 -->
+<g id="node3" class="node">
+<title>T0</title>
+<text text-anchor="start" x="11" y="-15.3" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">public</text>
+</g>
+<!-- T0&#45;&gt;0 -->
+<g id="edge2" class="edge">
+<title>T0&#45;&gt;0</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M36,-36.1686C36,-43.869 36,-53.0257 36,-61.5834"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="32.5001,-61.5867 36,-71.5867 39.5001,-61.5868 32.5001,-61.5867"/>
+</g>
+<!-- T1 -->
+<g id="node4" class="node">
+<title>T1</title>
+<text text-anchor="start" x="159" y="-15.3" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">draft</text>
+</g>
+<!-- T1&#45;&gt;1 -->
+<g id="edge3" class="edge">
+<title>T1&#45;&gt;1</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M180,-36.1686C180,-43.869 180,-53.0257 180,-61.5834"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="176.5001,-61.5867 180,-71.5867 183.5001,-61.5868 176.5001,-61.5867"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg02-b.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="427pt" height="332pt"
+ viewBox="0.00 0.00 427.00 332.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 328)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-324 0,-324 0,-288 72,-288 72,-324"/>
+<text text-anchor="middle" x="36" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-324 144,-324 144,-288 216,-288 216,-324"/>
+<text text-anchor="middle" x="180" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">1:f649</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-306C90.9973,-306 113.9327,-306 133.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-309.5001 143.924,-306 133.924,-302.5001 133.9241,-309.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-180 144,-180 144,-144 216,-144 216,-180"/>
+<text text-anchor="middle" x="180" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">2:96d8</text>
+</g>
+<!-- 0&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>0&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M54.2377,-287.7623C79.6646,-262.3354 125.8747,-216.1253 154.6431,-187.3569"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="157.3142,-189.6356 161.9104,-180.0896 152.3644,-184.6858 157.3142,-189.6356"/>
+</g>
+<!-- 3 -->
+<g id="node4" class="node">
+<title>3</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-36 144,-36 144,0 216,0 216,-36"/>
+<text text-anchor="middle" x="180" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">3:522d</text>
+</g>
+<!-- 0&#45;&gt;3 -->
+<g id="edge3" class="edge">
+<title>0&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M45.0078,-287.9843C69.5046,-238.9909 137.4407,-103.1186 166.5153,-44.9694"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="169.6539,-46.5184 170.9956,-36.0089 163.3929,-43.3879 169.6539,-46.5184"/>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge4" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M180,-279.7351C180,-250.8541 180,-205.2198 180,-180.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="180" cy="-283.7623" rx="4" ry="4"/>
+</g>
+<!-- 2&#45;&gt;3 -->
+<g id="edge5" class="edge">
+<title>2&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M180,-135.7351C180,-106.8541 180,-61.2198 180,-36.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="180" cy="-139.7623" rx="4" ry="4"/>
+</g>
+<!-- T12 -->
+<g id="node5" class="node">
+<title>T12</title>
+<text text-anchor="start" x="237" y="-231.3" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">obsolete (and hidden)</text>
+</g>
+<!-- T12&#45;&gt;1 -->
+<g id="edge6" class="edge">
+<title>T12&#45;&gt;1</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M287.6627,-252.1686C268.6604,-261.6698 245.2242,-273.3879 225.0748,-283.4626"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="223.455,-280.3593 216.076,-287.962 226.5855,-286.6203 223.455,-280.3593"/>
+</g>
+<!-- T12&#45;&gt;2 -->
+<g id="edge7" class="edge">
+<title>T12&#45;&gt;2</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M287.6627,-215.8314C268.6604,-206.3302 245.2242,-194.6121 225.0748,-184.5374"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="226.5855,-181.3797 216.076,-180.038 223.455,-187.6407 226.5855,-181.3797"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg03.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="427pt" height="188pt"
+ viewBox="0.00 0.00 427.00 188.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 184)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-180 0,-180 0,-144 72,-144 72,-180"/>
+<text text-anchor="middle" x="36" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-180 144,-180 144,-144 216,-144 216,-180"/>
+<text text-anchor="middle" x="180" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">1:f649</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-162C90.9973,-162 113.9327,-162 133.8329,-162"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-165.5001 143.924,-162 133.924,-158.5001 133.9241,-165.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-36 144,-36 144,0 216,0 216,-36"/>
+<text text-anchor="middle" x="180" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">2:522d</text>
+</g>
+<!-- 0&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>0&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M54.2377,-143.7623C79.6646,-118.3354 125.8747,-72.1253 154.6431,-43.3569"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="157.3142,-45.6356 161.9104,-36.0896 152.3644,-40.6858 157.3142,-45.6356"/>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge3" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M180,-135.7351C180,-106.8541 180,-61.2198 180,-36.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="180" cy="-139.7623" rx="4" ry="4"/>
+</g>
+<!-- T1 -->
+<g id="node4" class="node">
+<title>T1</title>
+<text text-anchor="start" x="237" y="-93.8" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">obsolete (and hidden)</text>
+<text text-anchor="start" x="266" y="-79.8" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">after the push</text>
+</g>
+<!-- T1&#45;&gt;1 -->
+<g id="edge4" class="edge">
+<title>T1&#45;&gt;1</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M287.6627,-108.1686C268.6604,-117.6698 245.2242,-129.3879 225.0748,-139.4626"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="223.455,-136.3593 216.076,-143.962 226.5855,-142.6203 223.455,-136.3593"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg04-a.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="427pt" height="476pt"
+ viewBox="0.00 0.00 427.00 476.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 472)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-468 0,-468 0,-432 72,-432 72,-468"/>
+<text text-anchor="middle" x="36" y="-446.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-468 144,-468 144,-432 216,-432 216,-468"/>
+<text text-anchor="middle" x="180" y="-446.3" font-family="mono" font-size="14.00" fill="#000000">1:f649</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-450C90.9973,-450 113.9327,-450 133.8329,-450"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-453.5001 143.924,-450 133.924,-446.5001 133.9241,-453.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-324 144,-324 144,-288 216,-288 216,-324"/>
+<text text-anchor="middle" x="180" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">2:522d</text>
+</g>
+<!-- 0&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>0&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M54.2377,-431.7623C79.6646,-406.3354 125.8747,-360.1253 154.6431,-331.3569"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="157.3142,-333.6356 161.9104,-324.0896 152.3644,-328.6858 157.3142,-333.6356"/>
+</g>
+<!-- 3 -->
+<g id="node4" class="node">
+<title>3</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-180 144,-180 144,-144 216,-144 216,-180"/>
+<text text-anchor="middle" x="180" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">3:e42b</text>
+</g>
+<!-- 0&#45;&gt;3 -->
+<g id="edge3" class="edge">
+<title>0&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M45.0078,-431.9843C69.5046,-382.9909 137.4407,-247.1186 166.5153,-188.9694"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="169.6539,-190.5184 170.9956,-180.0089 163.3929,-187.3879 169.6539,-190.5184"/>
+</g>
+<!-- 4 -->
+<g id="node5" class="node">
+<title>4</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-36 144,-36 144,0 216,0 216,-36"/>
+<text text-anchor="middle" x="180" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">4:7b49</text>
+</g>
+<!-- 0&#45;&gt;4 -->
+<g id="edge4" class="edge">
+<title>0&#45;&gt;4</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M41.1494,-431.6714C54.9755,-382.8681 94.5425,-245.8557 134,-134 144.7835,-103.4306 158.6756,-68.9686 168.3589,-45.607"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="171.6138,-46.8951 172.2298,-36.3182 165.1524,-44.2024 171.6138,-46.8951"/>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge5" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M180,-423.7351C180,-394.8541 180,-349.2198 180,-324.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="180" cy="-427.7623" rx="4" ry="4"/>
+</g>
+<!-- 2&#45;&gt;3 -->
+<g id="edge6" class="edge">
+<title>2&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M180,-279.7351C180,-250.8541 180,-205.2198 180,-180.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="180" cy="-283.7623" rx="4" ry="4"/>
+</g>
+<!-- 3&#45;&gt;4 -->
+<g id="edge7" class="edge">
+<title>3&#45;&gt;4</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M180,-135.7351C180,-106.8541 180,-61.2198 180,-36.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="180" cy="-139.7623" rx="4" ry="4"/>
+</g>
+<!-- T3 -->
+<g id="node6" class="node">
+<title>T3</title>
+<text text-anchor="start" x="237" y="-231.3" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">not in the other repo</text>
+</g>
+<!-- T3&#45;&gt;3 -->
+<g id="edge8" class="edge">
+<title>T3&#45;&gt;3</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M287.6627,-215.8314C268.6604,-206.3302 245.2242,-194.6121 225.0748,-184.5374"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="226.5855,-181.3797 216.076,-180.038 223.455,-187.6407 226.5855,-181.3797"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg04-b.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="427pt" height="476pt"
+ viewBox="0.00 0.00 427.00 476.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 472)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-468 0,-468 0,-432 72,-432 72,-468"/>
+<text text-anchor="middle" x="36" y="-446.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-468 144,-468 144,-432 216,-432 216,-468"/>
+<text text-anchor="middle" x="180" y="-446.3" font-family="mono" font-size="14.00" fill="#000000">1:f649</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-450C90.9973,-450 113.9327,-450 133.8329,-450"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-453.5001 143.924,-450 133.924,-446.5001 133.9241,-453.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-324 144,-324 144,-288 216,-288 216,-324"/>
+<text text-anchor="middle" x="180" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">2:96d8</text>
+</g>
+<!-- 0&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>0&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M54.2377,-431.7623C79.6646,-406.3354 125.8747,-360.1253 154.6431,-331.3569"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="157.3142,-333.6356 161.9104,-324.0896 152.3644,-328.6858 157.3142,-333.6356"/>
+</g>
+<!-- 3 -->
+<g id="node4" class="node">
+<title>3</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-180 144,-180 144,-144 216,-144 216,-180"/>
+<text text-anchor="middle" x="180" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">3:522d</text>
+</g>
+<!-- 0&#45;&gt;3 -->
+<g id="edge3" class="edge">
+<title>0&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M45.0078,-431.9843C69.5046,-382.9909 137.4407,-247.1186 166.5153,-188.9694"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="169.6539,-190.5184 170.9956,-180.0089 163.3929,-187.3879 169.6539,-190.5184"/>
+</g>
+<!-- 4 -->
+<g id="node5" class="node">
+<title>4</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="216,-36 144,-36 144,0 216,0 216,-36"/>
+<text text-anchor="middle" x="180" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">4:7b49</text>
+</g>
+<!-- 0&#45;&gt;4 -->
+<g id="edge4" class="edge">
+<title>0&#45;&gt;4</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M41.1494,-431.6714C54.9755,-382.8681 94.5425,-245.8557 134,-134 144.7835,-103.4306 158.6756,-68.9686 168.3589,-45.607"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="171.6138,-46.8951 172.2298,-36.3182 165.1524,-44.2024 171.6138,-46.8951"/>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge5" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M180,-423.7351C180,-394.8541 180,-349.2198 180,-324.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="180" cy="-427.7623" rx="4" ry="4"/>
+</g>
+<!-- 2&#45;&gt;3 -->
+<g id="edge6" class="edge">
+<title>2&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M180,-279.7351C180,-250.8541 180,-205.2198 180,-180.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="180" cy="-283.7623" rx="4" ry="4"/>
+</g>
+<!-- 3&#45;&gt;4 -->
+<g id="edge7" class="edge">
+<title>3&#45;&gt;4</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M180,-135.7351C180,-106.8541 180,-61.2198 180,-36.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="180" cy="-139.7623" rx="4" ry="4"/>
+</g>
+<!-- T2 -->
+<g id="node6" class="node">
+<title>T2</title>
+<text text-anchor="start" x="237" y="-231.3" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">not in the other repo</text>
+</g>
+<!-- T2&#45;&gt;2 -->
+<g id="edge8" class="edge">
+<title>T2&#45;&gt;2</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M287.6627,-252.1686C268.6604,-261.6698 245.2242,-273.3879 225.0748,-283.4626"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="223.455,-280.3593 216.076,-287.962 226.5855,-286.6203 223.455,-280.3593"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg05.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="224pt" height="116pt"
+ viewBox="0.00 0.00 224.00 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-108 0,-108 0,-72 72,-72 72,-108"/>
+<text text-anchor="middle" x="36" y="-86.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="216,-108 144,-108 144,-72 216,-72 216,-108"/>
+<text text-anchor="middle" x="180" y="-86.3" font-family="mono" font-size="14.00" fill="#000000">1:7b49</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-90C90.9973,-90 113.9327,-90 133.8329,-90"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-93.5001 143.924,-90 133.924,-86.5001 133.9241,-93.5001"/>
+</g>
+<!-- T1 -->
+<g id="node3" class="node">
+<title>T1</title>
+<text text-anchor="start" x="17" y="-15.3" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">only the final version</text>
+</g>
+<!-- T1&#45;&gt;1 -->
+<g id="edge2" class="edge">
+<title>T1&#45;&gt;1</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M126.1686,-36.1686C134.7152,-44.7152 145.0557,-55.0557 154.3802,-64.3802"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="152.0408,-66.9905 161.5867,-71.5867 156.9905,-62.0408 152.0408,-66.9905"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg06.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="368pt" height="188pt"
+ viewBox="0.00 0.00 368.00 188.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 184)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-180 0,-180 0,-144 72,-144 72,-180"/>
+<text text-anchor="middle" x="36" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="216,-180 144,-180 144,-144 216,-144 216,-180"/>
+<text text-anchor="middle" x="180" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">1:7b49</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-162C90.9973,-162 113.9327,-162 133.8329,-162"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-165.5001 143.924,-162 133.924,-158.5001 133.9241,-165.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="360,-180 288,-180 288,-144 360,-144 360,-180"/>
+<text text-anchor="middle" x="324" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">2:4e96</text>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.3373,-162C234.9973,-162 257.9327,-162 277.8329,-162"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="277.9241,-165.5001 287.924,-162 277.924,-158.5001 277.9241,-165.5001"/>
+</g>
+<!-- 3 -->
+<g id="node4" class="node">
+<title>3</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="360,-36 288,-36 288,0 360,0 360,-36"/>
+<text text-anchor="middle" x="324" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">3:3363</text>
+</g>
+<!-- 1&#45;&gt;3 -->
+<g id="edge3" class="edge">
+<title>1&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M198.2377,-143.7623C223.6646,-118.3354 269.8747,-72.1253 298.6431,-43.3569"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="301.3142,-45.6356 305.9104,-36.0896 296.3644,-40.6858 301.3142,-45.6356"/>
+</g>
+<!-- 2&#45;&gt;3 -->
+<g id="edge4" class="edge">
+<title>2&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M324,-135.7351C324,-106.8541 324,-61.2198 324,-36.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="324" cy="-139.7623" rx="4" ry="4"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg07-a.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="512pt" height="332pt"
+ viewBox="0.00 0.00 512.00 332.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 328)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-324 0,-324 0,-288 72,-288 72,-324"/>
+<text text-anchor="middle" x="36" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="216,-324 144,-324 144,-288 216,-288 216,-324"/>
+<text text-anchor="middle" x="180" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">1:7b49</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-306C90.9973,-306 113.9327,-306 133.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-309.5001 143.924,-306 133.924,-302.5001 133.9241,-309.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="360,-324 288,-324 288,-288 360,-288 360,-324"/>
+<text text-anchor="middle" x="324" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">2:4e96</text>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.3373,-306C234.9973,-306 257.9327,-306 277.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="277.9241,-309.5001 287.924,-306 277.924,-302.5001 277.9241,-309.5001"/>
+</g>
+<!-- 3 -->
+<g id="node4" class="node">
+<title>3</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="360,-180 288,-180 288,-144 360,-144 360,-180"/>
+<text text-anchor="middle" x="324" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">3:3363</text>
+</g>
+<!-- 1&#45;&gt;3 -->
+<g id="edge3" class="edge">
+<title>1&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M198.2377,-287.7623C223.6646,-262.3354 269.8747,-216.1253 298.6431,-187.3569"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="301.3142,-189.6356 305.9104,-180.0896 296.3644,-184.6858 301.3142,-189.6356"/>
+</g>
+<!-- 4 -->
+<g id="node5" class="node">
+<title>4</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="504,-324 432,-324 432,-288 504,-288 504,-324"/>
+<text text-anchor="middle" x="468" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">4:c7ff</text>
+</g>
+<!-- 1&#45;&gt;4 -->
+<g id="edge4" class="edge">
+<title>1&#45;&gt;4</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.2429,-293.0352C234.5048,-287.1762 257.1468,-280.9206 278,-278 318.4937,-272.3287 329.5063,-272.3287 370,-278 387.269,-280.4186 405.7649,-285.1243 421.984,-289.9979"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="421.1689,-293.4097 431.7571,-293.0352 423.2464,-286.7251 421.1689,-293.4097"/>
+</g>
+<!-- 5 -->
+<g id="node6" class="node">
+<title>5</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="504,-180 432,-180 432,-144 504,-144 504,-180"/>
+<text text-anchor="middle" x="468" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">5:1bb4</text>
+</g>
+<!-- 1&#45;&gt;5 -->
+<g id="edge5" class="edge">
+<title>1&#45;&gt;5</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.1838,-287.9081C268.5617,-261.7192 365.4693,-213.2654 422.5836,-184.7082"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="424.3587,-187.7338 431.7377,-180.1311 421.2282,-181.4728 424.3587,-187.7338"/>
+</g>
+<!-- 6 -->
+<g id="node7" class="node">
+<title>6</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="504,-36 432,-36 432,0 504,0 504,-36"/>
+<text text-anchor="middle" x="468" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">6:9d21</text>
+</g>
+<!-- 1&#45;&gt;6 -->
+<g id="edge6" class="edge">
+<title>1&#45;&gt;6</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M186.8006,-287.7418C200.0681,-254.0493 232.1707,-181.2361 278,-134 319.9081,-90.8055 381.135,-57.2385 422.6711,-37.5692"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="424.1521,-40.7405 431.7405,-33.3467 421.1976,-34.3945 424.1521,-40.7405"/>
+</g>
+<!-- 2&#45;&gt;3 -->
+<g id="edge7" class="edge">
+<title>2&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M324,-279.7351C324,-250.8541 324,-205.2198 324,-180.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="324" cy="-283.7623" rx="4" ry="4"/>
+</g>
+<!-- 4&#45;&gt;5 -->
+<g id="edge8" class="edge">
+<title>4&#45;&gt;5</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M468,-279.7351C468,-250.8541 468,-205.2198 468,-180.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="468" cy="-283.7623" rx="4" ry="4"/>
+</g>
+<!-- 5&#45;&gt;6 -->
+<g id="edge9" class="edge">
+<title>5&#45;&gt;6</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M468,-135.7351C468,-106.8541 468,-61.2198 468,-36.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="468" cy="-139.7623" rx="4" ry="4"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg07-b.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="368pt" height="44pt"
+ viewBox="0.00 0.00 368.00 44.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 40)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-36 0,-36 0,0 72,0 72,-36"/>
+<text text-anchor="middle" x="36" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="216,-36 144,-36 144,0 216,0 216,-36"/>
+<text text-anchor="middle" x="180" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">1:7b49</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-18C90.9973,-18 113.9327,-18 133.8329,-18"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-21.5001 143.924,-18 133.924,-14.5001 133.9241,-21.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="360,-36 288,-36 288,0 360,0 360,-36"/>
+<text text-anchor="middle" x="324" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">2:9d21</text>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.3373,-18C234.9973,-18 257.9327,-18 277.8329,-18"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="277.9241,-21.5001 287.924,-18 277.924,-14.5001 277.9241,-21.5001"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg08-a.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="656pt" height="332pt"
+ viewBox="0.00 0.00 656.00 332.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 328)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-324 0,-324 0,-288 72,-288 72,-324"/>
+<text text-anchor="middle" x="36" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="216,-324 144,-324 144,-288 216,-288 216,-324"/>
+<text text-anchor="middle" x="180" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">1:7b49</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-306C90.9973,-306 113.9327,-306 133.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-309.5001 143.924,-306 133.924,-302.5001 133.9241,-309.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="360,-324 288,-324 288,-288 360,-288 360,-324"/>
+<text text-anchor="middle" x="324" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">2:4e96</text>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.3373,-306C234.9973,-306 257.9327,-306 277.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="277.9241,-309.5001 287.924,-306 277.924,-302.5001 277.9241,-309.5001"/>
+</g>
+<!-- 3 -->
+<g id="node4" class="node">
+<title>3</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="360,-180 288,-180 288,-144 360,-144 360,-180"/>
+<text text-anchor="middle" x="324" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">3:3363</text>
+</g>
+<!-- 1&#45;&gt;3 -->
+<g id="edge3" class="edge">
+<title>1&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M198.2377,-287.7623C223.6646,-262.3354 269.8747,-216.1253 298.6431,-187.3569"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="301.3142,-189.6356 305.9104,-180.0896 296.3644,-184.6858 301.3142,-189.6356"/>
+</g>
+<!-- 4 -->
+<g id="node5" class="node">
+<title>4</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="504,-324 432,-324 432,-288 504,-288 504,-324"/>
+<text text-anchor="middle" x="468" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">4:c7ff</text>
+</g>
+<!-- 1&#45;&gt;4 -->
+<g id="edge4" class="edge">
+<title>1&#45;&gt;4</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.2429,-293.0352C234.5048,-287.1762 257.1468,-280.9206 278,-278 318.4937,-272.3287 329.5063,-272.3287 370,-278 387.269,-280.4186 405.7649,-285.1243 421.984,-289.9979"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="421.1689,-293.4097 431.7571,-293.0352 423.2464,-286.7251 421.1689,-293.4097"/>
+</g>
+<!-- 5 -->
+<g id="node6" class="node">
+<title>5</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="504,-180 432,-180 432,-144 504,-144 504,-180"/>
+<text text-anchor="middle" x="468" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">5:1bb4</text>
+</g>
+<!-- 1&#45;&gt;5 -->
+<g id="edge5" class="edge">
+<title>1&#45;&gt;5</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.1838,-287.9081C268.5617,-261.7192 365.4693,-213.2654 422.5836,-184.7082"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="424.3587,-187.7338 431.7377,-180.1311 421.2282,-181.4728 424.3587,-187.7338"/>
+</g>
+<!-- 6 -->
+<g id="node7" class="node">
+<title>6</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="504,-36 432,-36 432,0 504,0 504,-36"/>
+<text text-anchor="middle" x="468" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">6:9d21</text>
+</g>
+<!-- 1&#45;&gt;6 -->
+<g id="edge6" class="edge">
+<title>1&#45;&gt;6</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M186.8006,-287.7418C200.0681,-254.0493 232.1707,-181.2361 278,-134 319.9081,-90.8055 381.135,-57.2385 422.6711,-37.5692"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="424.1521,-40.7405 431.7405,-33.3467 421.1976,-34.3945 424.1521,-40.7405"/>
+</g>
+<!-- 2&#45;&gt;3 -->
+<g id="edge8" class="edge">
+<title>2&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M324,-279.7351C324,-250.8541 324,-205.2198 324,-180.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="324" cy="-283.7623" rx="4" ry="4"/>
+</g>
+<!-- 7 -->
+<g id="node8" class="node">
+<title>7</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="648,-324 576,-324 576,-288 648,-288 648,-324"/>
+<text text-anchor="middle" x="612" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">7:dd15</text>
+</g>
+<!-- 3&#45;&gt;7 -->
+<g id="edge11" class="edge">
+<title>3&#45;&gt;7</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M367.5785,-183.7892C424.4025,-212.2013 522.7749,-261.3875 575.7377,-287.8689"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="363.7615" cy="-181.8808" rx="4" ry="4"/>
+</g>
+<!-- 4&#45;&gt;5 -->
+<g id="edge9" class="edge">
+<title>4&#45;&gt;5</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M468,-279.7351C468,-250.8541 468,-205.2198 468,-180.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="468" cy="-283.7623" rx="4" ry="4"/>
+</g>
+<!-- 5&#45;&gt;6 -->
+<g id="edge10" class="edge">
+<title>5&#45;&gt;6</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M468,-135.7351C468,-106.8541 468,-61.2198 468,-36.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="468" cy="-139.7623" rx="4" ry="4"/>
+</g>
+<!-- 6&#45;&gt;7 -->
+<g id="edge7" class="edge">
+<title>6&#45;&gt;7</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M477.0078,-36.0157C501.5046,-85.0091 569.4407,-220.8814 598.5153,-279.0306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="595.3929,-280.6121 602.9956,-287.9911 601.6539,-277.4816 595.3929,-280.6121"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg08-b.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="512pt" height="44pt"
+ viewBox="0.00 0.00 512.00 44.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 40)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-36 0,-36 0,0 72,0 72,-36"/>
+<text text-anchor="middle" x="36" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="216,-36 144,-36 144,0 216,0 216,-36"/>
+<text text-anchor="middle" x="180" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">1:7b49</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-18C90.9973,-18 113.9327,-18 133.8329,-18"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-21.5001 143.924,-18 133.924,-14.5001 133.9241,-21.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="360,-36 288,-36 288,0 360,0 360,-36"/>
+<text text-anchor="middle" x="324" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">2:9d21</text>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.3373,-18C234.9973,-18 257.9327,-18 277.8329,-18"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="277.9241,-21.5001 287.924,-18 277.924,-14.5001 277.9241,-21.5001"/>
+</g>
+<!-- 3 -->
+<g id="node4" class="node">
+<title>3</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="504,-36 432,-36 432,0 504,0 504,-36"/>
+<text text-anchor="middle" x="468" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">3:dd15</text>
+</g>
+<!-- 2&#45;&gt;3 -->
+<g id="edge3" class="edge">
+<title>2&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M360.3373,-18C378.9973,-18 401.9327,-18 421.8329,-18"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="421.9241,-21.5001 431.924,-18 421.924,-14.5001 421.9241,-21.5001"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg09.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="915pt" height="332pt"
+ viewBox="0.00 0.00 915.00 332.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 328)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-324 0,-324 0,-288 72,-288 72,-324"/>
+<text text-anchor="middle" x="36" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="216,-324 144,-324 144,-288 216,-288 216,-324"/>
+<text text-anchor="middle" x="180" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">1:7b49</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-306C90.9973,-306 113.9327,-306 133.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-309.5001 143.924,-306 133.924,-302.5001 133.9241,-309.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="360,-324 288,-324 288,-288 360,-288 360,-324"/>
+<text text-anchor="middle" x="324" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">2:9d21</text>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.3373,-306C234.9973,-306 257.9327,-306 277.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="277.9241,-309.5001 287.924,-306 277.924,-302.5001 277.9241,-309.5001"/>
+</g>
+<!-- 3 -->
+<g id="node4" class="node">
+<title>3</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="504,-324 432,-324 432,-288 504,-288 504,-324"/>
+<text text-anchor="middle" x="468" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">3:dd15</text>
+</g>
+<!-- 2&#45;&gt;3 -->
+<g id="edge3" class="edge">
+<title>2&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M360.3373,-306C378.9973,-306 401.9327,-306 421.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="421.9241,-309.5001 431.924,-306 421.924,-302.5001 421.9241,-309.5001"/>
+</g>
+<!-- 4 -->
+<g id="node5" class="node">
+<title>4</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="648,-324 576,-324 576,-288 648,-288 648,-324"/>
+<text text-anchor="middle" x="612" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">4:b2be</text>
+</g>
+<!-- 3&#45;&gt;4 -->
+<g id="edge4" class="edge">
+<title>3&#45;&gt;4</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M504.3373,-306C522.9973,-306 545.9327,-306 565.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="565.9241,-309.5001 575.924,-306 565.924,-302.5001 565.9241,-309.5001"/>
+</g>
+<!-- 5 -->
+<g id="node6" class="node">
+<title>5</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="1,5" points="648,-180 576,-180 576,-144 648,-144 648,-180"/>
+<text text-anchor="middle" x="612" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">5:541f</text>
+</g>
+<!-- 3&#45;&gt;5 -->
+<g id="edge5" class="edge">
+<title>3&#45;&gt;5</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M486.2377,-287.7623C511.6646,-262.3354 557.8747,-216.1253 586.6431,-187.3569"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="589.3142,-189.6356 593.9104,-180.0896 584.3644,-184.6858 589.3142,-189.6356"/>
+</g>
+<!-- 6 -->
+<g id="node7" class="node">
+<title>6</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="1,5" points="648,-36 576,-36 576,0 648,0 648,-36"/>
+<text text-anchor="middle" x="612" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">6:e3a5</text>
+</g>
+<!-- 3&#45;&gt;6 -->
+<g id="edge6" class="edge">
+<title>3&#45;&gt;6</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M477.0078,-287.9843C501.5046,-238.9909 569.4407,-103.1186 598.5153,-44.9694"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="601.6539,-46.5184 602.9956,-36.0089 595.3929,-43.3879 601.6539,-46.5184"/>
+</g>
+<!-- 4&#45;&gt;5 -->
+<g id="edge7" class="edge">
+<title>4&#45;&gt;5</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M612,-279.7351C612,-250.8541 612,-205.2198 612,-180.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="612" cy="-283.7623" rx="4" ry="4"/>
+</g>
+<!-- 4&#45;&gt;6 -->
+<g id="edge8" class="edge">
+<title>4&#45;&gt;6</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M625.3853,-280.468C636.6169,-257.5116 651.7909,-222.5014 658,-190 662.6703,-165.5532 662.6703,-158.4468 658,-134 651.089,-97.8245 633.0717,-58.541 621.7462,-36.23"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="623.5304" cy="-284.19" rx="4" ry="4"/>
+</g>
+<!-- T5 -->
+<g id="node8" class="node">
+<title>T5</title>
+<text text-anchor="start" x="710.5" y="-303.3" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">working dir</text>
+</g>
+<!-- T5&#45;&gt;5 -->
+<g id="edge9" class="edge">
+<title>T5&#45;&gt;5</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M737.7623,-287.7623C712.3354,-262.3354 666.1253,-216.1253 637.3569,-187.3569"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="639.6356,-184.6858 630.0896,-180.0896 634.6858,-189.6356 639.6356,-184.6858"/>
+</g>
+<!-- T56 -->
+<g id="node9" class="node">
+<title>T56</title>
+<text text-anchor="start" x="757.5" y="-87.3" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">content&#45;divergent</text>
+</g>
+<!-- T56&#45;&gt;5 -->
+<g id="edge10" class="edge">
+<title>T56&#45;&gt;5</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M773.7729,-108.0757C738.0585,-119.9805 691.8113,-135.3962 657.9171,-146.6943"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="656.6429,-143.4296 648.2629,-149.9124 658.8566,-150.0704 656.6429,-143.4296"/>
+</g>
+<!-- T56&#45;&gt;6 -->
+<g id="edge11" class="edge">
+<title>T56&#45;&gt;6</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M773.7729,-71.9243C738.0585,-60.0195 691.8113,-44.6038 657.9171,-33.3057"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="658.8566,-29.9296 648.2629,-30.0876 656.6429,-36.5704 658.8566,-29.9296"/>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-sg10.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: Mercurial graph Pages: 1 -->
+<svg width="826pt" height="332pt"
+ viewBox="0.00 0.00 826.00 332.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 328)">
+<title>Mercurial graph</title>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="72,-324 0,-324 0,-288 72,-288 72,-324"/>
+<text text-anchor="middle" x="36" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">0:0dc9</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node">
+<title>1</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="216,-324 144,-324 144,-288 216,-288 216,-324"/>
+<text text-anchor="middle" x="180" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">1:7b49</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge1" class="edge">
+<title>0&#45;&gt;1</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M72.3373,-306C90.9973,-306 113.9327,-306 133.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="133.9241,-309.5001 143.924,-306 133.924,-302.5001 133.9241,-309.5001"/>
+</g>
+<!-- 2 -->
+<g id="node3" class="node">
+<title>2</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="360,-324 288,-324 288,-288 360,-288 360,-324"/>
+<text text-anchor="middle" x="324" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">2:9d21</text>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge2" class="edge">
+<title>1&#45;&gt;2</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M216.3373,-306C234.9973,-306 257.9327,-306 277.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="277.9241,-309.5001 287.924,-306 277.924,-302.5001 277.9241,-309.5001"/>
+</g>
+<!-- 3 -->
+<g id="node4" class="node">
+<title>3</title>
+<polygon fill="none" stroke="#000000" stroke-width="4" points="504,-324 432,-324 432,-288 504,-288 504,-324"/>
+<text text-anchor="middle" x="468" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">3:dd15</text>
+</g>
+<!-- 2&#45;&gt;3 -->
+<g id="edge3" class="edge">
+<title>2&#45;&gt;3</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M360.3373,-306C378.9973,-306 401.9327,-306 421.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="421.9241,-309.5001 431.924,-306 421.924,-302.5001 421.9241,-309.5001"/>
+</g>
+<!-- 4 -->
+<g id="node5" class="node">
+<title>4</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="648,-324 576,-324 576,-288 648,-288 648,-324"/>
+<text text-anchor="middle" x="612" y="-302.3" font-family="mono" font-size="14.00" fill="#000000">4:b2be</text>
+</g>
+<!-- 3&#45;&gt;4 -->
+<g id="edge4" class="edge">
+<title>3&#45;&gt;4</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M504.3373,-306C522.9973,-306 545.9327,-306 565.8329,-306"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="565.9241,-309.5001 575.924,-306 565.924,-302.5001 565.9241,-309.5001"/>
+</g>
+<!-- 5 -->
+<g id="node6" class="node">
+<title>5</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="648,-180 576,-180 576,-144 648,-144 648,-180"/>
+<text text-anchor="middle" x="612" y="-158.3" font-family="mono" font-size="14.00" fill="#000000">5:541f</text>
+</g>
+<!-- 3&#45;&gt;5 -->
+<g id="edge5" class="edge">
+<title>3&#45;&gt;5</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M486.2377,-287.7623C511.6646,-262.3354 557.8747,-216.1253 586.6431,-187.3569"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="589.3142,-189.6356 593.9104,-180.0896 584.3644,-184.6858 589.3142,-189.6356"/>
+</g>
+<!-- 6 -->
+<g id="node7" class="node">
+<title>6</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="648,-36 576,-36 576,0 648,0 648,-36"/>
+<text text-anchor="middle" x="612" y="-14.3" font-family="mono" font-size="14.00" fill="#000000">6:e3a5</text>
+</g>
+<!-- 3&#45;&gt;6 -->
+<g id="edge6" class="edge">
+<title>3&#45;&gt;6</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M477.0078,-287.9843C501.5046,-238.9909 569.4407,-103.1186 598.5153,-44.9694"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="601.6539,-46.5184 602.9956,-36.0089 595.3929,-43.3879 601.6539,-46.5184"/>
+</g>
+<!-- 7 -->
+<g id="node8" class="node">
+<title>7</title>
+<polygon fill="none" stroke="#000000" stroke-width="2" points="792,-108 720,-108 720,-72 792,-72 792,-108"/>
+<text text-anchor="middle" x="756" y="-86.3" font-family="mono" font-size="14.00" fill="#000000">7:aa82</text>
+</g>
+<!-- 3&#45;&gt;7 -->
+<g id="edge7" class="edge">
+<title>3&#45;&gt;7</title>
+<path fill="none" stroke="#000000" stroke-width="2" d="M503.3193,-287.8752C542.8036,-266.8509 607.7858,-229.9307 658,-190 686.3425,-167.4619 714.8841,-137.2922 733.7957,-116.0045"/>
+<polygon fill="#000000" stroke="#000000" stroke-width="2" points="736.5806,-118.1376 740.5518,-108.3152 731.322,-113.5173 736.5806,-118.1376"/>
+</g>
+<!-- 4&#45;&gt;5 -->
+<g id="edge9" class="edge">
+<title>4&#45;&gt;5</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M612,-279.7351C612,-250.8541 612,-205.2198 612,-180.0896"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="612" cy="-283.7623" rx="4" ry="4"/>
+</g>
+<!-- 4&#45;&gt;6 -->
+<g id="edge8" class="edge">
+<title>4&#45;&gt;6</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M625.3853,-280.468C636.6169,-257.5116 651.7909,-222.5014 658,-190 662.6703,-165.5532 662.6703,-158.4468 658,-134 651.089,-97.8245 633.0717,-58.541 621.7462,-36.23"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="623.5304" cy="-284.19" rx="4" ry="4"/>
+</g>
+<!-- 5&#45;&gt;7 -->
+<g id="edge10" class="edge">
+<title>5&#45;&gt;7</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M655.7235,-140.1383C676.2619,-129.869 700.45,-117.775 719.924,-108.038"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="651.915" cy="-142.0425" rx="4" ry="4"/>
+</g>
+<!-- 6&#45;&gt;7 -->
+<g id="edge11" class="edge">
+<title>6&#45;&gt;7</title>
+<path fill="none" stroke="#000000" stroke-width="2" stroke-dasharray="5,2" d="M655.7235,-39.8617C676.2619,-50.131 700.45,-62.225 719.924,-71.962"/>
+<ellipse fill="#000000" stroke="#000000" stroke-width="2" cx="651.915" cy="-37.9575" rx="4" ry="4"/>
+</g>
+<!-- T7 -->
+<g id="node9" class="node">
+<title>T7</title>
+<text text-anchor="start" x="702" y="-237.8" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">final, single</text>
+<text text-anchor="start" x="718.5" y="-223.8" font-family="mono" font-style="italic" font-size="14.00" fill="#000000">successor</text>
+</g>
+<!-- T7&#45;&gt;7 -->
+<g id="edge12" class="edge">
+<title>T7&#45;&gt;7</title>
+<path fill="none" stroke="#c0c0c0" stroke-width="2" d="M756,-215.7623C756,-191.201 756,-147.2474 756,-118.3541"/>
+<polygon fill="#c0c0c0" stroke="#c0c0c0" stroke-width="2" points="759.5001,-118.0896 756,-108.0896 752.5001,-118.0897 759.5001,-118.0896"/>
+</g>
+</g>
+</svg>
--- a/docs/figures/figure-ug07.svg	Sat Oct 05 13:50:11 2019 -0400
+++ b/docs/figures/figure-ug07.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -236,7 +236,7 @@
          id="tspan8594"
          x="113.19138"
          y="21.624107"
-         style="font-size:12px;line-height:1.25;font-family:monospace">hg evolve --all</tspan></text>
+         style="font-size:12px;line-height:1.25;font-family:monospace">hg evolve</tspan></text>
     <g
        id="g6372"
        transform="translate(63.844068,-32.28608)">
--- a/docs/figures/figure-ug09.svg	Sat Oct 05 13:50:11 2019 -0400
+++ b/docs/figures/figure-ug09.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -110,7 +110,7 @@
          id="tspan8594"
          x="132.17838"
          y="-88.939552"
-         style="font-size:12px;line-height:1.25;font-family:monospace">hg evolve --all</tspan></text>
+         style="font-size:12px;line-height:1.25;font-family:monospace">hg evolve</tspan></text>
     <g
        id="g6372"
        transform="translate(82.830913,-142.84994)">
--- a/docs/figures/figure-ug10.svg	Sat Oct 05 13:50:11 2019 -0400
+++ b/docs/figures/figure-ug10.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -570,7 +570,7 @@
          sodipodi:role="line"
          x="79.694885"
          y="806.03015"
-         style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg evolve --all</tspan></text>
+         style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg evolve</tspan></text>
     <g
        id="g6372-4-2"
        transform="translate(32.179684,745.12164)">
--- a/docs/figures/figure-ug12.svg	Sat Oct 05 13:50:11 2019 -0400
+++ b/docs/figures/figure-ug12.svg	Thu Nov 28 10:54:04 2019 +0100
@@ -333,7 +333,7 @@
            x="76.696045"
            sodipodi:role="line"
            id="tspan3322"
-           style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg evolve --all</tspan></text>
+           style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg evolve</tspan></text>
       <g
          transform="translate(29.180861,844.4619)"
          id="g6372-4-2">
--- a/docs/sharing.rst	Sat Oct 05 13:50:11 2019 -0400
+++ b/docs/sharing.rst	Thu Nov 28 10:54:04 2019 +0100
@@ -160,12 +160,18 @@
 At this point, ``dev-repo`` and ``test-repo`` have the same changesets
 in the same phases:
 
-  [figure SG01: rev 0:0dc9 public, rev 1:f649 draft, same on both repos]
+.. figure:: figures/figure-sg01-ab.svg
+
+   Figure 1 a: ``dev-repo`` has rev 0:0dc9 public, rev 1:f649 draft
+
+.. figure:: figures/figure-sg01-ab.svg
+
+   Figure 1 b: the same exact picture in ``test-repo``
 
 (You may notice a change in notation from the user guide: now
 changesets are labelled with their revision number and the first four
 digits of the 40-digit hexadecimal changeset ID. Mercurial revision
-numbers are never stable when working across repositories, especially
+numbers are not consistent when working across repositories, especially
 when obsolescence is involved. We'll see why shortly.)
 
 Now let's switch to ``test-repo`` to test our change::
@@ -181,16 +187,31 @@
 punctuation and capitalization (oops). Let's amend our preliminary fix
 (and fix the lame commit message while we're at it)::
 
+  $ echo 'Fix fix fix' > file1
+  $ hg amend -m 'fix bug 37'
+
+For the sake of illustrating how obsolete changesets are not exchanged, let's
+amend again::
+
   $ echo 'Fix fix fix.' > file1
   $ hg amend -m 'fix bug 37'
 
+Note: some time ago, evolve used to create temporary amend commits. Here,
+amending twice in a row is reminiscent of that behaviour that you may have seen
+in older tutorials.
+
 Now we're in a funny intermediate state (figure 2): revision 1:f649 is
-obsolete in ``test-repo``, having been replaced by revision 3:60ff
-(revision 2:2a03 is another one of those temporary amend commits that
-we saw in the user guide)—but ``dev-repo`` knows nothing of these
-recent developments.
+obsolete in ``test-repo``, having been replaced by revision 2:96d8 and then by
+3:522d—but ``dev-repo`` knows nothing of these recent developments.
+
+.. figure:: figures/figure-sg01-ab.svg
 
-  [figure SG02: test-repo has rev 0:0dc9 public, rev 1:f649, 2:2a03 obsolete, rev 3:60ff draft; dev-repo same as in SG01]
+   Figure 2 a: ``dev-repo`` same as in Figure 01 a
+
+.. figure:: figures/figure-sg02-b.svg
+
+   Figure 2 b: ``test-repo`` has rev 0:0dc9 public, revs 1:f649 and 2:96d8
+   obsolete, rev 3:522d draft
 
 Let's resynchronize::
 
@@ -198,15 +219,22 @@
   $ hg pull -u
   [...]
   added 1 changesets with 1 changes to 1 files (+1 heads)
+  2 new obsolescence markers
+  obsoleted 1 changesets
+  new changesets 522d503432a2 (1 drafts)
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  updated to "522d503432a2: fix bug 37"
+  1 other heads for branch "default"
 
 As seen in figure 3, this transfers the new changeset *and* the
 obsolescence marker for revision 1. However, it does *not* transfer
-the temporary amend commit, because it is hidden. Push and pull
-transfer obsolescence markers between repositories, but they do not
-transfer hidden changesets.
+2:96d8, because it is hidden. Push and pull transfer obsolescence
+markers between repositories, but they do not transfer hidden changesets.
 
-  [figure SG03: dev-repo grows new rev 2:60ff, marks 1:f649 obsolete]
+.. figure:: figures/figure-sg03.svg
+
+   Figure 3: ``dev-repo`` receives rev 2:522d, 1:f649 is now obsolete like in
+   ``test-repo``
 
 Because of this deliberately incomplete synchronization, revision
 numbers in ``test-repo`` and ``dev-repo`` are no longer consistent. We
@@ -220,16 +248,24 @@
 less-than-perfect idea. We'll implement it locally in ``dev-repo`` and
 push to ``test-repo``::
 
+  $ echo 'Fix, fix, and fix' > file1
+  $ hg amend
   $ echo 'Fix, fix, and fix.' > file1
   $ hg amend
   $ hg push
 
-This time around, the temporary amend commit is in ``dev-repo``, and
+This time around, the first amend commit stays in ``dev-repo``, and
 it is not transferred to ``test-repo``—the same as before, just in the
 opposite direction. Figure 4 shows the two repositories after amending
 in ``dev-repo`` and pushing to ``test-repo``.
 
-  [figure SG04: each repo has one temporary amend commit, but they're different in each one]
+.. figure:: figures/figure-sg04-a.svg
+
+   Figure 4 a: in ``dev-repo`` the extra amend commit is 3:e42b
+
+.. figure:: figures/figure-sg04-b.svg
+
+   Figure 4 b: and in ``test-repo`` it is 2:96d8
 
 Let's hop over to ``test-repo`` to test the more elegant fix::
 
@@ -243,8 +279,9 @@
   $ hg push
   [...]
   added 1 changesets with 1 changes to 1 files
+  4 new obsolescence markers
 
-Note that only one changeset—the final version, after two
+Note that only one changeset—the final version, after all the
 amendments—was actually pushed. Again, Mercurial doesn't transfer
 hidden changesets on push and pull.
 
@@ -254,12 +291,14 @@
 ``dev-repo`` or ``test-repo``. Neither of our missteps nor our amendments
 are publicly visible, just the final, beautifully polished changeset:
 
-  [figure SG05: public repo with rev 0:0dc9, 1:de61, both public]
+.. figure:: figures/figure-sg05.svg
+
+   Figure 5: in ``public`` repo with revs 0:0dc9 and 1:7b49, both public
 
 There is one important step left to do. Because we pushed from
 ``test-repo`` to ``public``, the pushed changeset is in *public* phase
 in those two repositories. But ``dev-repo`` has been out-of-the-loop;
-changeset de61 is still *draft* there. If we're not careful, we might
+changeset 7b49 is still *draft* there. If we're not careful, we might
 mutate history in ``dev-repo``, obsoleting a changeset that is already
 public. Let's avoid that situation for now by pushing up to
 ``dev-repo``::
@@ -381,11 +420,16 @@
   $ hg push
   [...]
   added 1 changesets with 1 changes to 1 files (+1 heads)
+  1 new obsolescence markers
+  obsoleted 1 changesets
   updating bookmark bug15
 
 Figure 6 shows the state of the ``review`` repository at this point.
 
-  [figure SG06: rev 2:fn1e is Alice's obsolete v1, rev 3:cbdf is her v2; both children of rev 1:de61]
+.. figure:: figures/figure-sg06.svg
+
+   Figure 6: rev 2:4e96 is Alice's obsolete v1, rev 3:3363 is her v2; both
+   children of rev 1:7b49
 
 After a busy morning of bug fixing, Alice stops for lunch. Let's see
 what Bob has been up to.
@@ -401,7 +445,7 @@
   $ cd ../bob
   $ echo 'stuff' > file1
   $ hg bookmark featureX
-  $ hg commit -u bob -m 'implement feature X (v1)'          # rev 4:1636
+  $ hg commit -u bob -m 'implement feature X (v1)'          # rev 4:c7ff
   $ hg push -B featureX
   [...]
   added 1 changesets with 1 changes to 1 files (+1 heads)
@@ -411,17 +455,19 @@
 bit, amends, and submits the resulting changeset for review::
 
   $ echo 'do stuff' > file1
-  $ hg amend -m 'implement feature X (v2)'                  # rev 5:0eb7
+  $ hg amend -m 'implement feature X (v2)'                  # rev 5:1bb4
   $ hg push
   [...]
   added 1 changesets with 1 changes to 1 files (+1 heads)
+  1 new obsolescence markers
+  obsoleted 1 changesets
   updating bookmark featureX
 
 Unfortunately, that still doesn't pass muster. Bob's reviewer insists
 on proper capitalization and punctuation. ::
 
   $ echo 'Do stuff.' > file1
-  $ hg amend -m 'implement feature X (v3)'                  # rev 6:540b
+  $ hg amend -m 'implement feature X (v3)'                  # rev 6:9d21
 
 On the bright side, the second review said, "Go ahead and publish once
 you fix that." So Bob immediately publishes his third attempt::
@@ -429,22 +475,33 @@
   $ hg push ../public
   [...]
   added 1 changesets with 1 changes to 1 files
+  2 new obsolescence markers
 
 It's not enough just to update ``public``, though! Other people also
 use the ``review`` repository, and right now it doesn't have Bob's
-latest amendment ("v3", revision 6:540b), nor does it know that the
-predecessor of that changeset ("v2", revision 5:0eb7) is obsolete. Thus,
+latest amendment ("v3", revision 6:9d21), nor does it know that the
+predecessor of that changeset ("v2", revision 5:1bb4) is obsolete. Thus,
 Bob pushes to ``review`` as well::
 
   $ hg push ../review
   [...]
   added 1 changesets with 1 changes to 1 files (+1 heads)
+  1 new obsolescence markers
+  obsoleted 1 changesets
   updating bookmark featureX
 
 Figure 7 shows the result of Bob's work in both ``review`` and
 ``public``.
 
-  [figure SG07: review includes Alice's draft work on bug 15, as well as Bob's v1, v2, and v3 changes for feature X: v1 and v2 obsolete, v3 public. public contains only the final, public implementation of feature X]
+.. figure:: figures/figure-sg07-a.svg
+
+   Figure 7 a: ``review`` includes Alice's draft work on bug 15, as well as
+   Bob's v1, v2, and v3 changes for feature X: v1 and v2 obsolete, v3 public
+
+.. figure:: figures/figure-sg07-b.svg
+
+   Figure 7 b: ``public`` contains only the final, public implementation of
+   feature X
 
 Incidentally, it's important that Bob push to ``public`` *before*
 ``review``. If he pushed to ``review`` first, then revision 6:540b
@@ -463,9 +520,9 @@
 
   $ hg push ../public
   [...]
-  remote has heads on branch 'default' that are not known locally: 540ba8f317e6
-  abort: push creates new remote head cbdfbd5a5db2!
-  (pull and merge or see "hg help push" for details about pushing new heads)
+  remote has heads on branch 'default' that are not known locally: 9d21d673314a
+  abort: push creates new remote head 3363442626b3 with bookmark 'bug15'!
+  (pull and merge or see 'hg help push' for details about pushing new heads)
 
 Oops! Bob has won the race to push first to ``public``. So Alice needs
 to integrate with Bob: let's pull his changeset(s) and see what the
@@ -476,9 +533,9 @@
   added 1 changesets with 1 changes to 1 files (+1 heads)
   (run 'hg heads' to see heads, 'hg merge' to merge)
   $ hg log -G -q -r 'head()' --template '{rev}:{node|short}  ({author})\n'
-  o  5:540ba8f317e6  (bob)
+  o  4:9d21d673314a  (bob)
   |
-  | @  4:cbdfbd5a5db2  (alice)
+  | @  3:3363442626b3  (alice)
   |/
 
 We'll assume Alice and Bob are perfectly comfortable with rebasing
@@ -486,19 +543,29 @@
 form of ``amend``.) So Alice rebases her changeset on top of Bob's and
 publishes the result::
 
-  $ hg rebase -d 5
+  $ hg rebase -d 4
   $ hg push ../public
   [...]
   added 1 changesets with 1 changes to 1 files
+  2 new obsolescence markers
   $ hg push ../review
   [...]
-  added 1 changesets with 0 changes to 0 files
+  added 1 changesets with 0 changes to 1 files
+  1 new obsolescence markers
+  obsoleted 1 changesets
   updating bookmark bug15
 
 The result, in both ``review`` and ``public`` repositories, is shown
 in figure 8.
 
-  [figure SG08: review shows v1 and v2 of Alice's fix, then v1, v2, v3 of Bob's feature, finally Alice's fix rebased onto Bob's. public just shows the final public version of each changeset]
+.. figure:: figures/figure-sg08-a.svg
+
+   Figure 8 a: ``review`` shows v1 and v2 of Alice's fix, then v1, v2, v3 of
+   Bob's feature, finally Alice's fix rebased onto Bob's
+
+.. figure:: figures/figure-sg08-b.svg
+
+   Figure 8 b: ``public`` just shows the final public version of each changeset
 
 Getting into trouble with shared mutable history
 ------------------------------------------------
@@ -567,7 +634,7 @@
 
   $ cd bob
   $ echo 'pretty good fix' >> file1
-  $ hg commit -u bob -m 'fix bug 24 (v1)'                   # rev 4:2fe6
+  $ hg commit -u bob -m 'fix bug 24 (v1)'                   # rev 4:b2be
 
 Since Alice and Bob are now in cowboy mode, Alice pulls Bob's draft
 changeset and amends it herself. ::
@@ -584,36 +651,42 @@
 
   $ cd ../bob
   $ echo 'better fix (bob)' >> file1
-  $ hg amend -u bob -m 'fix bug 24 (v2 by bob)'             # rev 6:a360
+  $ hg amend -u bob -m 'fix bug 24 (v2 by bob)'             # rev 5:541f
 
 At this point, the divergence exists, but only in theory: Bob's
-original changeset, 4:2fe6, is obsolete and has two successors. But
+original changeset, 4:b2be, is obsolete and has two successors. But
 those successors are in different repositories, so the trouble is not
 visible to anyone yet. It will be as soon as Bob pulls from Alice's
 repository (or vice-versa). ::
 
   $ hg pull ../alice
   [...]
-  added 1 changesets with 1 changes to 2 files (+1 heads)
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  1 new obsolescence markers
+  2 new content-divergent changesets
+  new changesets e3a586fd2377 (1 drafts)
   (run 'hg heads' to see heads, 'hg merge' to merge)
-  2 new content-divergent changesets
 
 Figure 9 shows the situation in Bob's repository.
 
-  [figure SG09: Bob's repo with 2 heads for the 2 content-divergent changesets, 6:a360 and 7:e3f9; wc is at 6:a360; both are successors of obsolete 4:2fe6, hence divergence]
+.. figure:: figures/figure-sg09.svg
+
+   Figure 9: Bob's repo with 2 heads for the 2 content-divergent changesets,
+   5:541f and 6:e3a5; wc is at 5:541f; both are successors of obsolete 4:b2be,
+   hence divergence
 
 Now we need to get out of trouble. As usual, the answer is to evolve
 history. ::
 
   $ HGMERGE=internal:other hg evolve
-  merge:[6] fix bug 24 (v2 by bob)
-  with: [7] fix bug 24 (v2 by alice)
+  merge:[5] fix bug 24 (v2 by bob)
+  with: [6] fix bug 24 (v2 by alice)
   base: [4] fix bug 24 (v1)
   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 
 Figure 10 shows how Bob's repository looks now.
 
-  [figure SG10: only one visible head, 9:5ad6, successor to hidden 6:a360 and 7:e3f9]
+  [figure SG10: only one visible head, 7:aa82, successor to hidden 5:541f and 6:e3a5]
 
 We carefully dodged a merge conflict by specifying a merge tool
 (``internal:other``) that will take Alice's changes over Bob's. (You
@@ -693,7 +766,7 @@
 As usual when there's trouble in your repository, the solution is to
 evolve it::
 
-  $ hg evolve --all
+  $ hg evolve
 
 Figure 8 illustrates Bob's repository after evolving away the phase-divergent
 changeset. Ignoring the obsolete changesets, Bob now has a nice,
--- a/docs/user-guide.rst	Sat Oct 05 13:50:11 2019 -0400
+++ b/docs/user-guide.rst	Thu Nov 28 10:54:04 2019 +0100
@@ -403,7 +403,7 @@
 
 The fix is to *evolve* history::
 
-  $ hg evolve --all
+  $ hg evolve
 
 This is a separate step, not automatically part of ``hg amend``,
 because there might be conflicts. If your amended changeset modifies a
@@ -418,7 +418,7 @@
 
 .. figure:: figures/figure-ug07.svg
 
-   Figure 7: evolve your repository (``hg evolve --all``) to take care
+   Figure 7: evolve your repository (``hg evolve``) to take care
    of instability. Orphan changesets become obsolete, and are
    replaced by successors just like the amended changeset was.
 
@@ -450,14 +450,14 @@
 As before, the solution to orphan changesets is to evolve your
 repository::
 
-  $ hg evolve --all
+  $ hg evolve
 
 This rebases revision 20 on top of 18 as the new revision 21, leaving
 19 and 20 obsolete and hidden:
 
 .. figure:: figures/figure-ug09.svg
 
-   Figure 9: once again, ``hg evolve --all`` takes care of instability.
+   Figure 9: once again, ``hg evolve`` takes care of instability.
 
 Example 9: Uncommit files from an older changeset (discard changes)
 =======================================================================
@@ -491,7 +491,7 @@
 hack, so we can discard it and immediately evolve the instability away::
 
   $ hg revert file2.c
-  $ hg evolve --all
+  $ hg evolve
   move:[23] fix bug 67
   atop:[24] fix bug 53
 
@@ -545,7 +545,7 @@
 This is where things get tricky. As usual when a repository has
 orphan changesets, we want to evolve it::
 
-  $ hg evolve --all
+  $ hg evolve
 
 The problem is that ``hg evolve`` rebases revision 27 onto revision
 28, creating 30 (the successor of 27). This is entirely logical: 27
@@ -570,7 +570,7 @@
 to normal state. For complicated implementation reasons, that command
 doesn't exist. (If you have already pushed an obsolescence marker to
 another repo, then Mercurial would need a way to revoke that remote
-obsolesence marker. That's a hard problem.)
+obsolescence marker. That's a hard problem.)
 
 Instead, ``evolve`` provides a ``touch`` command to resurrect an
 obsolete changeset. An unexpected quirk: you almost certainly need to
--- a/hgext3rd/evolve/__init__.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/evolve/__init__.py	Thu Nov 28 10:54:04 2019 +0100
@@ -525,14 +525,14 @@
 def _precursors(repo, s, includeidentical=False):
     """Precursor of a changeset"""
     cs = set()
-    nm = repo.changelog.nodemap
+    getrev = compat.getgetrev(repo.changelog)
     markerbysubj = repo.obsstore.predecessors
     node = repo.changelog.node
     for r in s:
         for p in markerbysubj.get(node(r), ()):
             if not includeidentical and p[2] & rewind.identicalflag:
                 continue
-            pr = nm.get(p[0])
+            pr = getrev(p[0])
             if pr is not None:
                 cs.add(pr)
     cs -= repo.changelog.filteredrevs # nodemap has no filtering
@@ -551,10 +551,10 @@
             if np not in seen:
                 seen.add(np)
                 toproceed.append(np)
-    nm = repo.changelog.nodemap
+    getrev = compat.getgetrev(repo.changelog)
     cs = set()
     for p in seen:
-        pr = nm.get(p)
+        pr = getrev(p)
         if pr is not None:
             cs.add(pr)
     cs -= repo.changelog.filteredrevs # nodemap has no filtering
@@ -564,12 +564,12 @@
     """Successors of a changeset"""
     cs = set()
     node = repo.changelog.node
-    nm = repo.changelog.nodemap
+    getrev = compat.getgetrev(repo.changelog)
     markerbyobj = repo.obsstore.successors
     for r in s:
         for p in markerbyobj.get(node(r), ()):
             for sub in p[1]:
-                sr = nm.get(sub)
+                sr = getrev(sub)
                 if sr is not None:
                     cs.add(sr)
     cs -= repo.changelog.filteredrevs # nodemap has no filtering
@@ -595,10 +595,10 @@
                 if sub not in seen:
                     seen.add(sub)
                     toproceed.append(sub)
-    nm = repo.changelog.nodemap
+    getrev = compat.getgetrev(repo.changelog)
     cs = set()
     for s in seen:
-        sr = nm.get(s)
+        sr = getrev(s)
         if sr is not None:
             cs.add(sr)
     cs -= repo.changelog.filteredrevs # nodemap has no filtering
--- a/hgext3rd/evolve/cmdrewrite.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/evolve/cmdrewrite.py	Thu Nov 28 10:54:04 2019 +0100
@@ -454,7 +454,7 @@
      (b'', b'revert', False, _(b'discard working directory changes after uncommit')),
      (b'n', b'note', b'', _(b'store a note on uncommit'), _(b'TEXT')),
      ] + commands.walkopts + commitopts + commitopts2 + commitopts3,
-    _(b'[OPTION]... [NAME]'))
+    _(b'[OPTION]... [FILE]...'))
 def uncommit(ui, repo, *pats, **opts):
     """move changes from parent revision to working directory
 
@@ -522,7 +522,7 @@
             # if not everything tracked in that directory can be
             # uncommitted.
             if badfiles:
-                badfiles -= set([f for f in util.dirs(eligible)])
+                badfiles -= set([f for f in compat.dirs(eligible)])
 
             try:
                 uipathfn = scmutil.getuipathfn(repo)
@@ -689,7 +689,7 @@
      (b'', b'from', None, _(b"fold revisions linearly to working copy parent")),
      (b'n', b'note', b'', _(b'store a note on fold'), _(b'TEXT')),
      ] + commitopts + commitopts2 + commitopts3,
-    _(b'hg fold [OPTION]... [-r] REV'),
+    _(b'hg fold [OPTION]... [-r] REV...'),
     helpbasic=True)
 def fold(ui, repo, *revs, **opts):
     """fold multiple revisions into a single one
@@ -820,7 +820,7 @@
      (b'', b'fold', None, _(b"also fold specified revisions into one")),
      (b'n', b'note', b'', _(b'store a note on metaedit'), _(b'TEXT')),
      ] + commitopts + commitopts2 + commitopts3,
-    _(b'hg metaedit [OPTION]... [-r] [REV]'))
+    _(b'hg metaedit [OPTION]... [[-r] REV]...'))
 def metaedit(ui, repo, *revs, **opts):
     """edit commit information
 
@@ -914,9 +914,8 @@
             updates = allctx[:]
             if p2 is not None and (root.p2() != p2 or not opts['fold']):
                 updates.append(p2)
-            # TODO: if the author and message are the same, don't create a new
-            # hash. Right now we create a new hash because the date can be
-            # different.
+            if not commitopts['fold'] and not commitopts['date']:
+                commitopts['date'] = root.date()
             commitopts = pycompat.byteskwargs(commitopts)
             newid, created = rewriteutil.rewrite(repo, root, updates, head,
                                                  [root.p1().node(),
@@ -978,7 +977,7 @@
       _(b"record a split (one precursor, multiple successors)")),
      (b'B', b'bookmark', [], _(b"remove revs only reachable from given"
                                b" bookmark"), _(b'BOOKMARK'))] + metadataopts,
-    _(b'[OPTION] [-r] REV...'),
+    _(b'[OPTION]... [-r] REV...'),
     helpbasic=True)
 # XXX -U  --noupdate option to prevent wc update and or bookmarks update ?
 def cmdprune(ui, repo, *revs, **opts):
@@ -1172,7 +1171,7 @@
      (b'r', b'rev', [], _(b"revision to split"), _(b'REV')),
      (b'n', b'note', b'', _(b"store a note on split"), _(b'TEXT')),
      ] + commitopts + commitopts2 + commitopts3,
-    _(b'hg split [OPTION] [-r REV] [FILES]'),
+    _(b'hg split [OPTION]... [-r REV] [FILE]...'),
     helpbasic=True)
 def cmdsplit(ui, repo, *pats, **opts):
     """split a changeset into smaller changesets
@@ -1348,7 +1347,7 @@
       b'mark the new revision as successor of the old one potentially creating '
       b'divergence')],
     # allow to choose the seed ?
-    _(b'[-r] revs'))
+    _(b'[OPTION]... [-r] REV...'))
 def touch(ui, repo, *revs, **opts):
     """create successors identical to their predecessors but the changeset ID
 
@@ -1449,7 +1448,7 @@
      (b'c', b'continue', False, b'continue interrupted pick'),
      (b'a', b'abort', False, b'abort interrupted pick'),
      ] + mergetoolopts,
-    _(b'[-r] rev'))
+    _(b'[OPTION]... [-r] REV'))
 def cmdpick(ui, repo, *revs, **opts):
     """move a commit on the top of working directory parent and updates to it."""
 
@@ -1519,8 +1518,11 @@
 
         if pickstate:
             pickstate.delete()
-        newctx = repo[newnode] if newnode else pctx
-        replacements = {origctx.node(): [newctx.node()]}
+        if newnode is None:
+            replacements = {origctx.node(): []}
+        else:
+            newctx = repo[newnode]
+            replacements = {origctx.node(): [newctx.node()]}
         scmutil.cleanupnodes(repo, replacements, operation=b"pick")
 
         if newnode is None:
--- a/hgext3rd/evolve/compat.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/evolve/compat.py	Thu Nov 28 10:54:04 2019 +0100
@@ -45,6 +45,13 @@
     displaygraph = cmdutil.displaygraph
     changesetdiffer = None
 
+# hg <= 5.3 (c21aca51b392)
+try:
+    from mercurial import pathutil
+    dirs = pathutil.dirs
+except (AttributeError, ImportError):
+    dirs = util.dirs
+
 from . import (
     exthelper,
 )
@@ -515,3 +522,11 @@
                      if meta.get(b'operation'))
 
     return sorted(operations)
+
+# nodemap.get and index.[has_node|rev|get_rev]
+# hg <= 5.3 (02802fa87b74)
+def getgetrev(cl):
+    """Returns index.get_rev or nodemap.get (for pre-5.3 Mercurial)."""
+    if util.safehasattr(cl.index, 'get_rev'):
+        return cl.index.get_rev
+    return cl.nodemap.get
--- a/hgext3rd/evolve/dagutil.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/evolve/dagutil.py	Thu Nov 28 10:54:04 2019 +0100
@@ -13,6 +13,8 @@
 from mercurial.i18n import _
 from mercurial.node import nullrev
 
+from . import compat
+
 class basedag(object):
     '''generic interface for DAGs
 
@@ -145,8 +147,9 @@
 
     def _internalizeall(self, ids, filterunknown):
         rl = self._revlog
+        getrev = compat.getgetrev(rl)
         if filterunknown:
-            return [r for r in map(rl.nodemap.get, ids)
+            return [r for r in map(getrev, ids)
                     if (r is not None
                         and r != nullrev
                         and r not in rl.filteredrevs)]
--- a/hgext3rd/evolve/debugcmd.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/evolve/debugcmd.py	Thu Nov 28 10:54:04 2019 +0100
@@ -17,7 +17,10 @@
 
 from mercurial.i18n import _
 
-from . import exthelper
+from . import (
+    compat,
+    exthelper,
+)
 
 eh = exthelper.exthelper()
 
@@ -43,7 +46,7 @@
 
     store = repo.obsstore
     unfi = repo.unfiltered()
-    nm = unfi.changelog.nodemap
+    getrev = compat.getgetrev(unfi.changelog)
     nbmarkers = len(store._all)
     ui.write(_(b'markers total:              %9i\n') % nbmarkers)
     sucscount = [0, 0, 0, 0]
@@ -58,7 +61,7 @@
     size_v0 = []
     size_v1 = []
     for mark in store:
-        if mark[0] in nm:
+        if getrev(mark[0]) is not None:
             known += 1
         nbsucs = len(mark[1])
         sucscount[min(nbsucs, 3)] += 1
@@ -133,7 +136,7 @@
 
     ui.write(b'        any known node:     %9i\n'
              % len([c for c in allclusters
-                    if [n for n in c[0] if nm.get(n) is not None]]))
+                    if [n for n in c[0] if getrev(n) is not None]]))
     if allclusters:
         nbcluster = len(allclusters)
         ui.write((b'        smallest length:    %9i\n' % len(allclusters[0][1])))
@@ -148,7 +151,7 @@
     ui.write((b'    using parents data:     %9i\n' % len(allpclusters)))
     ui.write(b'        any known node:     %9i\n'
              % len([c for c in allclusters
-                    if [n for n in c[0] if nm.get(n) is not None]]))
+                    if [n for n in c[0] if getrev(n) is not None]]))
     if allpclusters:
         nbcluster = len(allpclusters)
         ui.write((b'        smallest length:    %9i\n'
--- a/hgext3rd/evolve/metadata.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/evolve/metadata.py	Thu Nov 28 10:54:04 2019 +0100
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
-__version__ = b'9.2.1'
+__version__ = b'9.2.2.dev'
 testedwith = b'4.5.2 4.6.2 4.7 4.8 4.9 5.0 5.1'
 minimumhgversion = b'4.5'
 buglink = b'https://bz.mercurial-scm.org/'
--- a/hgext3rd/evolve/obscache.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/evolve/obscache.py	Thu Nov 28 10:54:04 2019 +0100
@@ -20,6 +20,7 @@
 )
 
 from . import (
+    compat,
     exthelper,
 )
 
@@ -389,9 +390,9 @@
 
     def _updatemarkers(self, repo, obsmarkers):
         """update the cache with new markers"""
-        rev = repo.changelog.nodemap.get
+        getrev = compat.getgetrev(repo.changelog)
         for m in obsmarkers:
-            r = rev(m[0])
+            r = getrev(m[0])
             if r is not None:
                 self._data[r] = 1
 
--- a/hgext3rd/evolve/obsdiscovery.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/evolve/obsdiscovery.py	Thu Nov 28 10:54:04 2019 +0100
@@ -414,8 +414,8 @@
                 max_stored = con.execute(_query_max_stored).fetchall()[0][0]
                 affected_nodes = _affectedby(repo, obsmarkers)
 
-                rev = repo.changelog.nodemap.get
-                affected = [rev(n) for n in affected_nodes]
+                getrev = compat.getgetrev(repo.changelog)
+                affected = [getrev(n) for n in affected_nodes]
                 affected = [r for r in affected
                             if r is not None and r <= max_stored]
 
@@ -646,8 +646,8 @@
     The range have the id encoded as a node
 
     return 'wdirid' for unknown range"""
-    nm = repo.changelog.nodemap
-    ranges = [(nm.get(n), idx) for n, idx in ranges]
+    getrev = compat.getgetrev(repo.changelog)
+    ranges = [(getrev(n), idx) for n, idx in ranges]
     if ranges:
         maxrev = max(r for r, i in ranges)
         if maxrev is not None:
--- a/hgext3rd/evolve/obshistory.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/evolve/obshistory.py	Thu Nov 28 10:54:04 2019 +0100
@@ -50,7 +50,7 @@
      (b'p', b'patch', False, _(b'show the patch between two obs versions')),
      (b'f', b'filternonlocal', False, _(b'filter out non local commits')),
      ] + commands.formatteropts,
-    _(b'hg olog [OPTION]... [REV]'))
+    _(b'hg olog [OPTION]... [[-r] REV]...'))
 def cmdobshistory(ui, repo, *revs, **opts):
     """show the obsolescence history of the specified revisions
 
--- a/hgext3rd/evolve/rewind.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/evolve/rewind.py	Thu Nov 28 10:54:04 2019 +0100
@@ -205,11 +205,11 @@
     updates = []
     if len(ctx.parents()) > 1:
         updates = ctx.parents()
-    extradict = {b'extra': extra}
+    commitopts = {b'extra': extra, b'date': ctx.date()}
 
     new, unusedvariable = rewriteutil.rewrite(unfi, ctx, updates, ctx,
                                               [p1, p2],
-                                              commitopts=extradict)
+                                              commitopts=commitopts)
 
     obsolete.createmarkers(unfi, [(ctx, (unfi[new],))],
                            flag=identicalflag, operation=b'rewind')
--- a/hgext3rd/pullbundle.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/pullbundle.py	Thu Nov 28 10:54:04 2019 +0100
@@ -180,7 +180,7 @@
 
 def sliceoutgoing(repo, outgoing):
     cl = repo.changelog
-    rev = cl.nodemap.get
+    rev = getgetrev(cl)
     node = cl.node
     revsort = repo.stablesort
 
@@ -623,3 +623,11 @@
 
 def fmtdist(name, data):
     return STATSFORMAT.format(name=name, **data)
+
+# nodemap.get and index.[has_node|rev|get_rev]
+# hg <= 5.3 (02802fa87b74)
+def getgetrev(cl):
+    """Returns index.get_rev or nodemap.get (for pre-5.3 Mercurial)."""
+    if util.safehasattr(cl.index, 'get_rev'):
+        return cl.index.get_rev
+    return cl.nodemap.get
--- a/hgext3rd/topic/__init__.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/topic/__init__.py	Thu Nov 28 10:54:04 2019 +0100
@@ -187,7 +187,7 @@
               b'topic.active': b'green',
               }
 
-__version__ = b'0.17.1'
+__version__ = b'0.17.2.dev'
 
 testedwith = b'4.5.2 4.6.2 4.7 4.8 4.9 5.0 5.1'
 minimumhgversion = b'4.5'
@@ -634,7 +634,7 @@
         (b'', b'age', False, b'show when you last touched the topics'),
         (b'', b'current', None, b'display the current topic only'),
     ] + commands.formatteropts,
-    _(b'hg topics [TOPIC]'))
+    _(b'hg topics [OPTION]... [-r REV]... [TOPIC]'))
 def topics(ui, repo, topic=None, **opts):
     """View current topic, set current topic, change topic for a set of revisions, or see all topics.
 
--- a/hgext3rd/topic/compat.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/topic/compat.py	Thu Nov 28 10:54:04 2019 +0100
@@ -10,6 +10,7 @@
 from mercurial import (
     obsolete,
     pycompat,
+    util,
 )
 
 getmarkers = None
@@ -34,3 +35,11 @@
     def branchmapitems(branchmap):
         return branchmap.iteritems()
     # py3-transform: on
+
+# nodemap.get and index.[has_node|rev|get_rev]
+# hg <= 5.3 (02802fa87b74)
+def getgetrev(cl):
+    """Returns index.get_rev or nodemap.get (for pre-5.3 Mercurial)."""
+    if util.safehasattr(cl.index, 'get_rev'):
+        return cl.index.get_rev
+    return cl.nodemap.get
--- a/hgext3rd/topic/discovery.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/topic/discovery.py	Thu Nov 28 10:54:04 2019 +0100
@@ -45,7 +45,7 @@
                              publishednode,
                              pushop.remotephases.publicheads)
 
-    rev = repo.unfiltered().changelog.nodemap.get
+    getrev = compat.getgetrev(repo.unfiltered().changelog)
 
     def remotebranchmap():
         # drop topic information from changeset about to be published
@@ -56,7 +56,7 @@
             else:
                 namedbranch = branch.split(b':', 1)[0]
                 for h in heads:
-                    r = rev(h)
+                    r = getrev(h)
                     if r is not None and r in publishedset:
                         result[namedbranch].append(h)
                     else:
--- a/hgext3rd/topic/topicmap.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/hgext3rd/topic/topicmap.py	Thu Nov 28 10:54:04 2019 +0100
@@ -14,6 +14,7 @@
 
 from . import (
     common,
+    compat,
 )
 
 basefilter = set([b'base', b'immutable'])
@@ -69,10 +70,10 @@
     revs = set()
     cl = repo.changelog
     fr = cl.filteredrevs
-    nm = cl.nodemap
+    getrev = compat.getgetrev(cl)
     for roots in repo._phasecache.phaseroots[1:]:
         for n in roots:
-            r = nm.get(n)
+            r = getrev(n)
             if r not in fr and r < maxrev:
                 revs.add(r)
     key = nullid
--- a/setup.py	Sat Oct 05 13:50:11 2019 -0400
+++ b/setup.py	Thu Nov 28 10:54:04 2019 +0100
@@ -13,7 +13,7 @@
 
 def get_version():
     '''Read version info from a file without importing it'''
-    return u'%s' % get_metadata()['__version__']
+    return get_metadata()['__version__'].decode()
 
 def min_hg_version():
     '''Read version info from a file without importing it'''
--- a/tests/test-metaedit.t	Sat Oct 05 13:50:11 2019 -0400
+++ b/tests/test-metaedit.t	Thu Nov 28 10:54:04 2019 +0100
@@ -1,46 +1,12 @@
+  $ . $TESTDIR/testlib/common.sh
+
   $ cat >> $HGRCPATH <<EOF
-  > [defaults]
-  > amend=-d "0 0"
-  > fold=-d "0 0"
-  > metaedit=-d "0 0"
-  > [web]
-  > push_ssl = false
-  > allow_push = *
-  > [phases]
-  > publish = False
   > [alias]
-  > qlog = log --template='{rev} - {node|short} {desc} ({phase})\n'
+  > glog = log -GT "{rev}:{node|short}@{branch}({phase}) {desc|firstline}"
   > gluf = log -GT "{rev}: {desc|firstline} - {author|user} ({files})"
-  > [diff]
-  > git = 1
-  > unified = 0
   > [extensions]
+  > evolve =
   > EOF
-  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
-  $ mkcommit() {
-  >    echo "$1" > "$1"
-  >    hg add "$1"
-  >    hg ci -m "$1"
-  > }
-
-  $ mkstack() {
-  >    # Creates a stack of commit based on $1 with messages from $2, $3 ..
-  >    hg update $1 -C
-  >    shift
-  >    mkcommits $*
-  > }
-
-  $ glog() {
-  >   hg log -G --template '{rev}:{node|short}@{branch}({phase}) {desc|firstline}\n' "$@"
-  > }
-
-  $ shaof() {
-  >   hg log -T {node} -r "first(desc($1))"
-  > }
-
-  $ mkcommits() {
-  >   for i in $@; do mkcommit $i ; done
-  > }
 
 ##########################
 importing Parren test
@@ -161,7 +127,7 @@
   2 changesets folded
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
-  $ glog -r .
+  $ hg glog -r .
   @  9:a08d35fd7d9d@default(draft) E
   |
   ~
@@ -198,18 +164,27 @@
   HG: added F
   nothing changed
 
-  $ glog -r '.^::.'
+  $ hg glog -r '.^::.'
   @  9:a08d35fd7d9d@default(draft) E
   |
   o  3:3260958f1169@default(draft) C
   |
   ~
 
-TODO: don't create a new commit in this case, we should take the date of the
-old commit (we add a default date with a value to show that metaedit is taking
-the current date to generate the hash, this way we still have a stable hash
-but highlight the bug)
-  $ hg metaedit --config defaults.metaedit= --config devel.default-date="42 0"
+metaedit should preserve the original date of the edited commit (issue5994)
+
+  $ hg metaedit --config devel.default-date=
+  nothing changed
+
+metaedit doesn't create new commit if message and user aren't changed
+
+  $ hg metaedit --config devel.default-date= --user test --message 'E
+  > 
+  > 
+  > F'
+  nothing changed
+
+  $ hg metaedit --config devel.default-date= --date "42 0"
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg log -r '.^::.' --template '{rev}: {desc|firstline}\n'
   3: C
--- a/tests/test-pick.t	Sat Oct 05 13:50:11 2019 -0400
+++ b/tests/test-pick.t	Thu Nov 28 10:54:04 2019 +0100
@@ -25,7 +25,7 @@
   $ hg init repo
   $ cd repo
   $ hg help pick
-  hg pick [-r] rev
+  hg pick [OPTION]... [-r] REV
   
   aliases: grab
   
@@ -167,6 +167,17 @@
   |
   o  0:1f0dee641bb7 add a
   
+
+there were no changes to commit, so there shouldn't be any predecessors of 6,
+and 2 should say it was pruned (issue6093)
+
+  $ hg olog --all --hidden -r 2+6
+  x  4538525df7e2 (2) add c
+       pruned using pick by test (Thu Jan 01 00:00:00 1970 +0000)
+  
+  @  c4636a81ebeb (6) add c
+  
+
 interrupted pick
 
   $ hg up d46dc301d92f
--- a/tests/test-rewind.t	Sat Oct 05 13:50:11 2019 -0400
+++ b/tests/test-rewind.t	Thu Nov 28 10:54:04 2019 +0100
@@ -164,24 +164,24 @@
   7e594302a05d3769b27be88fc3cdfd39d7498498 0 {579f120ba91885449adc92eedf48ef3569742cee} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'test'}
   7e594302a05d3769b27be88fc3cdfd39d7498498 073989a581cf430a844192364fa37606357cbbc2 4 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
   073989a581cf430a844192364fa37606357cbbc2 0 {579f120ba91885449adc92eedf48ef3569742cee} (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'test'}
-  7e594302a05d3769b27be88fc3cdfd39d7498498 48acf2c0d9c8961859ce9a913671eb2adc9b057b 4 (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
+  7e594302a05d3769b27be88fc3cdfd39d7498498 b13b032065ef57a68d9a4cead38ba0f34f95529b 4 (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
   $ hg obslog -r 'desc("c_B0")' --all
   x  073989a581cf (3) c_B0
   |    pruned using prune by test (Thu Jan 01 00:00:01 1970 +0000)
   |
-  | o  48acf2c0d9c8 (4) c_B0
+  | o  b13b032065ef (4) c_B0
   |/
   x  7e594302a05d (2) c_B0
        pruned using prune by test (Thu Jan 01 00:00:00 1970 +0000)
        rewritten(meta) as 073989a581cf using rewind by test (Thu Jan 01 00:00:00 1970 +0000)
-       rewritten(meta, date) as 48acf2c0d9c8 using rewind by test (Thu Jan 01 00:00:01 1970 +0000)
+       rewritten(meta) as b13b032065ef using rewind by test (Thu Jan 01 00:00:01 1970 +0000)
   
   $ hg log -G
-  o  changeset:   4:48acf2c0d9c8
+  o  changeset:   4:b13b032065ef
   |  tag:         tip
   |  parent:      1:579f120ba918
   |  user:        test
-  |  date:        Thu Jan 01 00:00:01 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     c_B0
   |
   o  changeset:   1:579f120ba918
@@ -195,11 +195,11 @@
      summary:     c_ROOT
   
   $ hg log -G --hidden
-  o  changeset:   4:48acf2c0d9c8
+  o  changeset:   4:b13b032065ef
   |  tag:         tip
   |  parent:      1:579f120ba918
   |  user:        test
-  |  date:        Thu Jan 01 00:00:01 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     c_B0
   |
   | x  changeset:   3:073989a581cf
@@ -212,7 +212,7 @@
   | x  changeset:   2:7e594302a05d
   |/   user:        test
   |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    obsolete:    rewritten using rewind as 4:48acf2c0d9c8
+  |    obsolete:    meta-changed using rewind as 4:b13b032065ef
   |    obsolete:    meta-changed using rewind as 3:073989a581cf
   |    summary:     c_B0
   |
@@ -267,20 +267,20 @@
   rewinded to 1 changesets
   $ hg debugobsolete
   7e594302a05d3769b27be88fc3cdfd39d7498498 25c8f5ab0c3bb569ec672570f1a901be4c6f032b 0 (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'}
-  7e594302a05d3769b27be88fc3cdfd39d7498498 48acf2c0d9c8961859ce9a913671eb2adc9b057b 4 (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
+  7e594302a05d3769b27be88fc3cdfd39d7498498 b13b032065ef57a68d9a4cead38ba0f34f95529b 4 (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
   $ hg obslog --rev 'desc("c_B0")'
-  *  48acf2c0d9c8 (4) c_B0
+  *  b13b032065ef (4) c_B0
   |
   x  7e594302a05d (2) c_B0
        rewritten(description, content) as 25c8f5ab0c3b using amend by test (Thu Jan 01 00:00:01 1970 +0000)
-       rewritten(meta, date) as 48acf2c0d9c8 using rewind by test (Thu Jan 01 00:00:01 1970 +0000)
+       rewritten(meta) as b13b032065ef using rewind by test (Thu Jan 01 00:00:01 1970 +0000)
   
   $ hg log -G
-  *  changeset:   4:48acf2c0d9c8
+  *  changeset:   4:b13b032065ef
   |  tag:         tip
   |  parent:      1:579f120ba918
   |  user:        test
-  |  date:        Thu Jan 01 00:00:01 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  instability: content-divergent
   |  summary:     c_B0
   |
@@ -302,11 +302,11 @@
      summary:     c_ROOT
   
   $ hg log -G --hidden
-  *  changeset:   4:48acf2c0d9c8
+  *  changeset:   4:b13b032065ef
   |  tag:         tip
   |  parent:      1:579f120ba918
   |  user:        test
-  |  date:        Thu Jan 01 00:00:01 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  instability: content-divergent
   |  summary:     c_B0
   |
@@ -320,7 +320,7 @@
   | x  changeset:   2:7e594302a05d
   |/   user:        test
   |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    obsolete:    rewritten using rewind as 4:48acf2c0d9c8
+  |    obsolete:    meta-changed using rewind as 4:b13b032065ef
   |    obsolete:    rewritten using amend as 3:25c8f5ab0c3b
   |    summary:     c_B0
   |
@@ -365,30 +365,30 @@
   $ hg rewind --hidden --to 'min(desc("c_B0"))'
   rewinded to 1 changesets
   (1 changesets obsoleted)
-  working directory is now at d8b4471cfb3c
+  working directory is now at 837cd997bb05
   $ hg debugobsolete
   7e594302a05d3769b27be88fc3cdfd39d7498498 25c8f5ab0c3bb569ec672570f1a901be4c6f032b 0 (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'}
-  7e594302a05d3769b27be88fc3cdfd39d7498498 48acf2c0d9c8961859ce9a913671eb2adc9b057b 4 (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  48acf2c0d9c8961859ce9a913671eb2adc9b057b 0 {579f120ba91885449adc92eedf48ef3569742cee} (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'test'}
-  7e594302a05d3769b27be88fc3cdfd39d7498498 d8b4471cfb3caa290e0a78ae6bc57d78656c9075 4 (Thu Jan 01 00:00:02 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  25c8f5ab0c3bb569ec672570f1a901be4c6f032b d8b4471cfb3caa290e0a78ae6bc57d78656c9075 0 (Thu Jan 01 00:00:02 1970 +0000) {'ef1': '43', 'operation': 'rewind', 'user': 'test'}
+  7e594302a05d3769b27be88fc3cdfd39d7498498 b13b032065ef57a68d9a4cead38ba0f34f95529b 4 (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  b13b032065ef57a68d9a4cead38ba0f34f95529b 0 {579f120ba91885449adc92eedf48ef3569742cee} (Thu Jan 01 00:00:01 1970 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'test'}
+  7e594302a05d3769b27be88fc3cdfd39d7498498 837cd997bb05a27f8ed7d1ba3ff1e8422b9b464e 4 (Thu Jan 01 00:00:02 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  25c8f5ab0c3bb569ec672570f1a901be4c6f032b 837cd997bb05a27f8ed7d1ba3ff1e8422b9b464e 0 (Thu Jan 01 00:00:02 1970 +0000) {'ef1': '11', 'operation': 'rewind', 'user': 'test'}
   $ hg obslog --rev 'desc("c_B0")'
-  @    d8b4471cfb3c (5) c_B0
+  @    837cd997bb05 (5) c_B0
   |\
   x |  25c8f5ab0c3b (3) c_B1
-  |/     rewritten(description, meta, date, content) as d8b4471cfb3c using rewind by test (Thu Jan 01 00:00:02 1970 +0000)
+  |/     rewritten(description, meta, content) as 837cd997bb05 using rewind by test (Thu Jan 01 00:00:02 1970 +0000)
   |
   x  7e594302a05d (2) c_B0
        rewritten(description, content) as 25c8f5ab0c3b using amend by test (Thu Jan 01 00:00:01 1970 +0000)
-       rewritten(meta, date) as 48acf2c0d9c8 using rewind by test (Thu Jan 01 00:00:01 1970 +0000)
-       rewritten(meta, date) as d8b4471cfb3c using rewind by test (Thu Jan 01 00:00:02 1970 +0000)
+       rewritten(meta) as 837cd997bb05 using rewind by test (Thu Jan 01 00:00:02 1970 +0000)
+       rewritten(meta) as b13b032065ef using rewind by test (Thu Jan 01 00:00:01 1970 +0000)
   
   $ hg log -G
-  @  changeset:   5:d8b4471cfb3c
+  @  changeset:   5:837cd997bb05
   |  tag:         tip
   |  parent:      1:579f120ba918
   |  user:        test
-  |  date:        Thu Jan 01 00:00:02 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     c_B0
   |
   o  changeset:   1:579f120ba918
@@ -402,17 +402,17 @@
      summary:     c_ROOT
   
   $ hg log -G --hidden
-  @  changeset:   5:d8b4471cfb3c
+  @  changeset:   5:837cd997bb05
   |  tag:         tip
   |  parent:      1:579f120ba918
   |  user:        test
-  |  date:        Thu Jan 01 00:00:02 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     c_B0
   |
-  | x  changeset:   4:48acf2c0d9c8
+  | x  changeset:   4:b13b032065ef
   |/   parent:      1:579f120ba918
   |    user:        test
-  |    date:        Thu Jan 01 00:00:01 1970 +0000
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
   |    obsolete:    pruned using prune
   |    summary:     c_B0
   |
@@ -420,14 +420,14 @@
   |/   parent:      1:579f120ba918
   |    user:        test
   |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    obsolete:    rewritten using rewind as 5:d8b4471cfb3c
+  |    obsolete:    rewritten using rewind as 5:837cd997bb05
   |    summary:     c_B1
   |
   | x  changeset:   2:7e594302a05d
   |/   user:        test
   |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    obsolete:    rewritten using rewind as 5:d8b4471cfb3c
-  |    obsolete:    rewritten using rewind as 4:48acf2c0d9c8
+  |    obsolete:    meta-changed using rewind as 4:b13b032065ef
+  |    obsolete:    meta-changed using rewind as 5:837cd997bb05
   |    obsolete:    rewritten using amend as 3:25c8f5ab0c3b
   |    summary:     c_B0
   |
@@ -585,46 +585,46 @@
   $ hg rewind --to '9576e80d6851+a0316c4c5417' --hidden
   rewinded to 2 changesets
   (1 changesets obsoleted)
-  working directory is now at 85be7b94f69e
+  working directory is now at 95d72d892df7
   $ hg debugobsolete
   49fb7d900906b0a3d329e90da4dcb0a7582d3b6e a0316c4c54179357e71d068fb8884678ebc7c351 9576e80d6851ce79cd535e2dc5fa01b444d89a39 0 (Thu Jan 01 00:00:02 1970 +0000) {'ef1': '12', 'operation': 'split', 'user': 'test'}
   49fb7d900906b0a3d329e90da4dcb0a7582d3b6e 4535d0af405c1bf35f37b35f26ec6f9acfa6fe0b 4 (Thu Jan 01 00:00:02 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
   9576e80d6851ce79cd535e2dc5fa01b444d89a39 4535d0af405c1bf35f37b35f26ec6f9acfa6fe0b 0 (Thu Jan 01 00:00:02 1970 +0000) {'ef1': '14', 'operation': 'rewind', 'user': 'test'}
   a0316c4c54179357e71d068fb8884678ebc7c351 4535d0af405c1bf35f37b35f26ec6f9acfa6fe0b 0 (Thu Jan 01 00:00:02 1970 +0000) {'ef1': '10', 'operation': 'rewind', 'user': 'test'}
-  a0316c4c54179357e71d068fb8884678ebc7c351 73a1ac2e570de1f33bbea7d8260b00d5af1d30a7 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  9576e80d6851ce79cd535e2dc5fa01b444d89a39 85be7b94f69e936d6f0fc52118211da82fe4e838 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  4535d0af405c1bf35f37b35f26ec6f9acfa6fe0b 73a1ac2e570de1f33bbea7d8260b00d5af1d30a7 85be7b94f69e936d6f0fc52118211da82fe4e838 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '46', 'operation': 'rewind', 'user': 'test'}
+  a0316c4c54179357e71d068fb8884678ebc7c351 e76375de0bfc9c59bdd91067c901f3eed7d6c8fe 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  9576e80d6851ce79cd535e2dc5fa01b444d89a39 95d72d892df7fec59107e10914c5729bdf03665f 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  4535d0af405c1bf35f37b35f26ec6f9acfa6fe0b e76375de0bfc9c59bdd91067c901f3eed7d6c8fe 95d72d892df7fec59107e10914c5729bdf03665f 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '14', 'operation': 'rewind', 'user': 'test'}
   $ hg obslog -r -2:
-  o    73a1ac2e570d (7) c_CD0
+  @    95d72d892df7 (8) c_CD0
   |\
-  +---@  85be7b94f69e (8) c_CD0
+  +---o  e76375de0bfc (7) c_CD0
   | | |
   x---+  4535d0af405c (6) c_CD0
-  |\| |    rewritten(meta, date, parent, content) as 73a1ac2e570d, 85be7b94f69e using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
+  |\| |    rewritten(meta, parent, content) as 95d72d892df7, e76375de0bfc using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   | | |
-  +---x  9576e80d6851 (5) c_CD0
-  | |      rewritten(meta, parent, content) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000)
-  | |      rewritten(meta, date, parent) as 85be7b94f69e using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
+  | x |  9576e80d6851 (5) c_CD0
+  |/ /     rewritten(meta, parent, content) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000)
+  | |      rewritten(meta, parent) as 95d72d892df7 using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   | |
   | x  a0316c4c5417 (4) c_CD0
   |/     rewritten(meta, content) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000)
-  |      rewritten(meta, date) as 73a1ac2e570d using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
+  |      rewritten(meta) as e76375de0bfc using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   |
   x  49fb7d900906 (3) c_CD0
        rewritten(meta) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000)
        rewritten(parent, content) as 9576e80d6851, a0316c4c5417 using split by test (Thu Jan 01 00:00:02 1970 +0000)
   
   $ hg log -G
-  @  changeset:   8:85be7b94f69e
+  @  changeset:   8:95d72d892df7
   |  tag:         tip
   |  user:        test
-  |  date:        Thu Jan 01 00:00:03 1970 +0000
+  |  date:        Thu Jan 01 00:00:02 1970 +0000
   |  summary:     c_CD0
   |
-  o  changeset:   7:73a1ac2e570d
+  o  changeset:   7:e76375de0bfc
   |  parent:      2:7e594302a05d
   |  user:        test
-  |  date:        Thu Jan 01 00:00:03 1970 +0000
+  |  date:        Thu Jan 01 00:00:02 1970 +0000
   |  summary:     c_CD0
   |
   o  changeset:   2:7e594302a05d
@@ -707,28 +707,28 @@
   1 new orphan changesets
   rewinded to 1 changesets
   (1 changesets obsoleted)
-  working directory is now at 96622b0702dd
+  working directory is now at ac979e0aac4e
   $ hg debugobsolete
   579f120ba91885449adc92eedf48ef3569742cee d952d1794ff657f5c2a82225d2e6307ed930b32f 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'}
   7e594302a05d3769b27be88fc3cdfd39d7498498 a65fceb2324ae1eb1231610193d24a5fa02c7c0e 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '4', 'operation': 'evolve', 'user': 'test'}
-  7e594302a05d3769b27be88fc3cdfd39d7498498 96622b0702dd86e3a702b0235b420da41f072efe 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  a65fceb2324ae1eb1231610193d24a5fa02c7c0e 96622b0702dd86e3a702b0235b420da41f072efe 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
+  7e594302a05d3769b27be88fc3cdfd39d7498498 ac979e0aac4e63ccbbf88ac33942192942302766 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  a65fceb2324ae1eb1231610193d24a5fa02c7c0e ac979e0aac4e63ccbbf88ac33942192942302766 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
   $ hg obslog
-  @    96622b0702dd (5) c_B0
+  @    ac979e0aac4e (5) c_B0
   |\
   | x  a65fceb2324a (4) c_B0
-  |/     rewritten(meta, date, parent) as 96622b0702dd using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
+  |/     rewritten(meta, parent) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   |
   x  7e594302a05d (2) c_B0
-       rewritten(meta, date) as 96622b0702dd using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
        rewritten(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000)
+       rewritten(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   
   $ hg log -G
-  @  changeset:   5:96622b0702dd
+  @  changeset:   5:ac979e0aac4e
   |  tag:         tip
   |  parent:      1:579f120ba918
   |  user:        test
-  |  date:        Thu Jan 01 00:00:03 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  instability: orphan
   |  summary:     c_B0
   |
@@ -759,14 +759,14 @@
   $ hg rewind --from '.'
   rewinded to 1 changesets
   (1 changesets obsoleted)
-  working directory is now at 7b1440274cc3
+  working directory is now at a5dd64adbb2a
   $ echo 'default-date = 5 0' >> $HGRCPATH
   $ hg log -G
-  @  changeset:   6:7b1440274cc3
+  @  changeset:   6:a5dd64adbb2a
   |  tag:         tip
   |  parent:      3:d952d1794ff6
   |  user:        test
-  |  date:        Thu Jan 01 00:00:04 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     c_B0
   |
   o  changeset:   3:d952d1794ff6
@@ -783,23 +783,23 @@
   $ hg debugobsolete
   579f120ba91885449adc92eedf48ef3569742cee d952d1794ff657f5c2a82225d2e6307ed930b32f 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'}
   7e594302a05d3769b27be88fc3cdfd39d7498498 a65fceb2324ae1eb1231610193d24a5fa02c7c0e 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '4', 'operation': 'evolve', 'user': 'test'}
-  7e594302a05d3769b27be88fc3cdfd39d7498498 96622b0702dd86e3a702b0235b420da41f072efe 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  a65fceb2324ae1eb1231610193d24a5fa02c7c0e 96622b0702dd86e3a702b0235b420da41f072efe 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  a65fceb2324ae1eb1231610193d24a5fa02c7c0e 7b1440274cc3b3f8bfcffc891172a7d2d7e9140c 4 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  96622b0702dd86e3a702b0235b420da41f072efe 7b1440274cc3b3f8bfcffc891172a7d2d7e9140c 0 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
+  7e594302a05d3769b27be88fc3cdfd39d7498498 ac979e0aac4e63ccbbf88ac33942192942302766 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  a65fceb2324ae1eb1231610193d24a5fa02c7c0e ac979e0aac4e63ccbbf88ac33942192942302766 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  a65fceb2324ae1eb1231610193d24a5fa02c7c0e a5dd64adbb2af2e646859b35d0d7128daa73cb2b 4 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  ac979e0aac4e63ccbbf88ac33942192942302766 a5dd64adbb2af2e646859b35d0d7128daa73cb2b 0 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
   $ hg obslog
-  @    7b1440274cc3 (6) c_B0
+  @    a5dd64adbb2a (6) c_B0
   |\
-  x |  96622b0702dd (5) c_B0
-  |\|    rewritten(meta, date, parent) as 7b1440274cc3 using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
+  | x  ac979e0aac4e (5) c_B0
+  |/|    rewritten(meta, parent) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
   | |
-  | x  a65fceb2324a (4) c_B0
-  |/     rewritten(meta, date) as 7b1440274cc3 using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
-  |      rewritten(meta, date, parent) as 96622b0702dd using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
+  x |  a65fceb2324a (4) c_B0
+  |/     rewritten(meta) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
+  |      rewritten(meta, parent) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   |
   x  7e594302a05d (2) c_B0
-       rewritten(meta, date) as 96622b0702dd using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
        rewritten(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000)
+       rewritten(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   
 Automatically rewinding the full stack (with --to)
 --------------------------------------------------
@@ -807,47 +807,47 @@
   $ hg rewind --hidden --to 'predecessors(.)'
   rewinded to 2 changesets
   (2 changesets obsoleted)
-  working directory is now at 70892f498f29
+  working directory is now at 3f2d8862657d
   $ hg debugobsolete
   579f120ba91885449adc92eedf48ef3569742cee d952d1794ff657f5c2a82225d2e6307ed930b32f 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'}
   7e594302a05d3769b27be88fc3cdfd39d7498498 a65fceb2324ae1eb1231610193d24a5fa02c7c0e 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '4', 'operation': 'evolve', 'user': 'test'}
-  7e594302a05d3769b27be88fc3cdfd39d7498498 96622b0702dd86e3a702b0235b420da41f072efe 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  a65fceb2324ae1eb1231610193d24a5fa02c7c0e 96622b0702dd86e3a702b0235b420da41f072efe 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  a65fceb2324ae1eb1231610193d24a5fa02c7c0e 7b1440274cc3b3f8bfcffc891172a7d2d7e9140c 4 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  96622b0702dd86e3a702b0235b420da41f072efe 7b1440274cc3b3f8bfcffc891172a7d2d7e9140c 0 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  579f120ba91885449adc92eedf48ef3569742cee c0d232501dd8e52b8ca8a266f25db89f5120c17f 4 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  96622b0702dd86e3a702b0235b420da41f072efe 70892f498f2993d626848bb312ff856168d0b9c4 4 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  7b1440274cc3b3f8bfcffc891172a7d2d7e9140c 70892f498f2993d626848bb312ff856168d0b9c4 0 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  d952d1794ff657f5c2a82225d2e6307ed930b32f c0d232501dd8e52b8ca8a266f25db89f5120c17f 0 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '43', 'operation': 'rewind', 'user': 'test'}
+  7e594302a05d3769b27be88fc3cdfd39d7498498 ac979e0aac4e63ccbbf88ac33942192942302766 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  a65fceb2324ae1eb1231610193d24a5fa02c7c0e ac979e0aac4e63ccbbf88ac33942192942302766 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  a65fceb2324ae1eb1231610193d24a5fa02c7c0e a5dd64adbb2af2e646859b35d0d7128daa73cb2b 4 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  ac979e0aac4e63ccbbf88ac33942192942302766 a5dd64adbb2af2e646859b35d0d7128daa73cb2b 0 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  579f120ba91885449adc92eedf48ef3569742cee 9c28b7ed3951fd15b20ab75449c1e0fdec445958 4 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  ac979e0aac4e63ccbbf88ac33942192942302766 3f2d8862657d20af331f0c0531f5228eef4d36c5 4 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  a5dd64adbb2af2e646859b35d0d7128daa73cb2b 3f2d8862657d20af331f0c0531f5228eef4d36c5 0 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  d952d1794ff657f5c2a82225d2e6307ed930b32f 9c28b7ed3951fd15b20ab75449c1e0fdec445958 0 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '11', 'operation': 'rewind', 'user': 'test'}
   $ hg obslog
-  @    70892f498f29 (8) c_B0
+  @    3f2d8862657d (8) c_B0
   |\
-  x |  7b1440274cc3 (6) c_B0
-  |\|    rewritten(meta, date, parent) as 70892f498f29 using rewind by test (Thu Jan 01 00:00:05 1970 +0000)
+  x |  a5dd64adbb2a (6) c_B0
+  |\|    rewritten(meta, parent) as 3f2d8862657d using rewind by test (Thu Jan 01 00:00:05 1970 +0000)
   | |
-  | x  96622b0702dd (5) c_B0
-  |/|    rewritten(meta, date, parent) as 70892f498f29 using rewind by test (Thu Jan 01 00:00:05 1970 +0000)
-  | |    rewritten(meta, date, parent) as 7b1440274cc3 using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
+  | x  ac979e0aac4e (5) c_B0
+  |/|    rewritten(meta, parent) as 3f2d8862657d using rewind by test (Thu Jan 01 00:00:05 1970 +0000)
+  | |    rewritten(meta, parent) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
   | |
   x |  a65fceb2324a (4) c_B0
-  |/     rewritten(meta, date) as 7b1440274cc3 using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
-  |      rewritten(meta, date, parent) as 96622b0702dd using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
+  |/     rewritten(meta) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
+  |      rewritten(meta, parent) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   |
   x  7e594302a05d (2) c_B0
-       rewritten(meta, date) as 96622b0702dd using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
        rewritten(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000)
+       rewritten(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   
   $ hg log -G
-  @  changeset:   8:70892f498f29
+  @  changeset:   8:3f2d8862657d
   |  tag:         tip
   |  user:        test
-  |  date:        Thu Jan 01 00:00:05 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     c_B0
   |
-  o  changeset:   7:c0d232501dd8
+  o  changeset:   7:9c28b7ed3951
   |  parent:      0:eba9c2249fe7
   |  user:        test
-  |  date:        Thu Jan 01 00:00:05 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     c_A0
   |
   o  changeset:   0:eba9c2249fe7
@@ -863,55 +863,55 @@
   $ hg rewind --hidden --from '.'
   rewinded to 2 changesets
   (2 changesets obsoleted)
-  working directory is now at 141aedbbde8f
+  working directory is now at d36d6d267714
   $ hg debugobsolete
   579f120ba91885449adc92eedf48ef3569742cee d952d1794ff657f5c2a82225d2e6307ed930b32f 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'}
   7e594302a05d3769b27be88fc3cdfd39d7498498 a65fceb2324ae1eb1231610193d24a5fa02c7c0e 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '4', 'operation': 'evolve', 'user': 'test'}
-  7e594302a05d3769b27be88fc3cdfd39d7498498 96622b0702dd86e3a702b0235b420da41f072efe 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  a65fceb2324ae1eb1231610193d24a5fa02c7c0e 96622b0702dd86e3a702b0235b420da41f072efe 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  a65fceb2324ae1eb1231610193d24a5fa02c7c0e 7b1440274cc3b3f8bfcffc891172a7d2d7e9140c 4 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  96622b0702dd86e3a702b0235b420da41f072efe 7b1440274cc3b3f8bfcffc891172a7d2d7e9140c 0 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  579f120ba91885449adc92eedf48ef3569742cee c0d232501dd8e52b8ca8a266f25db89f5120c17f 4 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  96622b0702dd86e3a702b0235b420da41f072efe 70892f498f2993d626848bb312ff856168d0b9c4 4 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  7b1440274cc3b3f8bfcffc891172a7d2d7e9140c 70892f498f2993d626848bb312ff856168d0b9c4 0 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  d952d1794ff657f5c2a82225d2e6307ed930b32f c0d232501dd8e52b8ca8a266f25db89f5120c17f 0 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '43', 'operation': 'rewind', 'user': 'test'}
-  d952d1794ff657f5c2a82225d2e6307ed930b32f 7b4aed5e99d2734da6cc25f0095876c5cb6e8084 4 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '34', 'operation': 'rewind', 'user': 'test'}
-  7b1440274cc3b3f8bfcffc891172a7d2d7e9140c 141aedbbde8f407fc8a8a7355221733b0fc01ca5 4 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  70892f498f2993d626848bb312ff856168d0b9c4 141aedbbde8f407fc8a8a7355221733b0fc01ca5 0 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '38', 'operation': 'rewind', 'user': 'test'}
-  c0d232501dd8e52b8ca8a266f25db89f5120c17f 7b4aed5e99d2734da6cc25f0095876c5cb6e8084 0 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '43', 'operation': 'rewind', 'user': 'test'}
+  7e594302a05d3769b27be88fc3cdfd39d7498498 ac979e0aac4e63ccbbf88ac33942192942302766 4 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  a65fceb2324ae1eb1231610193d24a5fa02c7c0e ac979e0aac4e63ccbbf88ac33942192942302766 0 (Thu Jan 01 00:00:03 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  a65fceb2324ae1eb1231610193d24a5fa02c7c0e a5dd64adbb2af2e646859b35d0d7128daa73cb2b 4 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  ac979e0aac4e63ccbbf88ac33942192942302766 a5dd64adbb2af2e646859b35d0d7128daa73cb2b 0 (Thu Jan 01 00:00:04 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  579f120ba91885449adc92eedf48ef3569742cee 9c28b7ed3951fd15b20ab75449c1e0fdec445958 4 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  ac979e0aac4e63ccbbf88ac33942192942302766 3f2d8862657d20af331f0c0531f5228eef4d36c5 4 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  a5dd64adbb2af2e646859b35d0d7128daa73cb2b 3f2d8862657d20af331f0c0531f5228eef4d36c5 0 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  d952d1794ff657f5c2a82225d2e6307ed930b32f 9c28b7ed3951fd15b20ab75449c1e0fdec445958 0 (Thu Jan 01 00:00:05 1970 +0000) {'ef1': '11', 'operation': 'rewind', 'user': 'test'}
+  d952d1794ff657f5c2a82225d2e6307ed930b32f fef4355b4cc9e2d3ddc154f60e4f4f1a286e9ce7 4 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  a5dd64adbb2af2e646859b35d0d7128daa73cb2b d36d6d267714108384f31762b6193c32f9f97514 4 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  3f2d8862657d20af331f0c0531f5228eef4d36c5 d36d6d267714108384f31762b6193c32f9f97514 0 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '6', 'operation': 'rewind', 'user': 'test'}
+  9c28b7ed3951fd15b20ab75449c1e0fdec445958 fef4355b4cc9e2d3ddc154f60e4f4f1a286e9ce7 0 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '11', 'operation': 'rewind', 'user': 'test'}
   $ hg obslog
-  @    141aedbbde8f (10) c_B0
+  @    d36d6d267714 (10) c_B0
   |\
-  x |  70892f498f29 (8) c_B0
-  |\|    rewritten(meta, date, parent) as 141aedbbde8f using rewind by test (Thu Jan 01 00:00:06 1970 +0000)
+  x |  3f2d8862657d (8) c_B0
+  |\|    rewritten(meta, parent) as d36d6d267714 using rewind by test (Thu Jan 01 00:00:06 1970 +0000)
   | |
-  | x  7b1440274cc3 (6) c_B0
-  |/|    rewritten(meta, date, parent) as 141aedbbde8f using rewind by test (Thu Jan 01 00:00:06 1970 +0000)
-  | |    rewritten(meta, date, parent) as 70892f498f29 using rewind by test (Thu Jan 01 00:00:05 1970 +0000)
+  | x  a5dd64adbb2a (6) c_B0
+  |/|    rewritten(meta, parent) as 3f2d8862657d using rewind by test (Thu Jan 01 00:00:05 1970 +0000)
+  | |    rewritten(meta, parent) as d36d6d267714 using rewind by test (Thu Jan 01 00:00:06 1970 +0000)
   | |
-  x |  96622b0702dd (5) c_B0
-  |\|    rewritten(meta, date, parent) as 70892f498f29 using rewind by test (Thu Jan 01 00:00:05 1970 +0000)
-  | |    rewritten(meta, date, parent) as 7b1440274cc3 using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
+  x |  ac979e0aac4e (5) c_B0
+  |\|    rewritten(meta, parent) as 3f2d8862657d using rewind by test (Thu Jan 01 00:00:05 1970 +0000)
+  | |    rewritten(meta, parent) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
   | |
   | x  a65fceb2324a (4) c_B0
-  |/     rewritten(meta, date) as 7b1440274cc3 using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
-  |      rewritten(meta, date, parent) as 96622b0702dd using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
+  |/     rewritten(meta) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000)
+  |      rewritten(meta, parent) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   |
   x  7e594302a05d (2) c_B0
-       rewritten(meta, date) as 96622b0702dd using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
        rewritten(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000)
+       rewritten(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000)
   
   $ hg log -G
-  @  changeset:   10:141aedbbde8f
+  @  changeset:   10:d36d6d267714
   |  tag:         tip
   |  user:        test
-  |  date:        Thu Jan 01 00:00:06 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     c_B0
   |
-  o  changeset:   9:7b4aed5e99d2
+  o  changeset:   9:fef4355b4cc9
   |  parent:      0:eba9c2249fe7
   |  user:        test
-  |  date:        Thu Jan 01 00:00:06 1970 +0000
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     c_A1
   |
   o  changeset:   0:eba9c2249fe7
--- a/tests/test-sharing.t	Sat Oct 05 13:50:11 2019 -0400
+++ b/tests/test-sharing.t	Thu Nov 28 10:54:04 2019 +0100
@@ -5,7 +5,7 @@
 
   $ cat >> $HGRCPATH <<EOF
   > [alias]
-  > shortlog = log --template '{rev}:{node|short}  {phase}  {desc|firstline}\n'
+  > shortlog = log --template '{rev}:{node|shortest}  {phase}  {desc|firstline}\n'
   > [extensions]
   > rebase =
   > EOF
@@ -57,24 +57,38 @@
   $ hg push -q ../test-repo
 
 Figure SG01 (roughly)
-  $ hg shortlog -G
-  @  1:f6490818a721  draft  prelim change
+  $ hg -R ../dev-repo shortlog -G
+  @  1:f649  draft  prelim change
   |
-  o  0:0dc9c9f6ab91  public  create new project
+  o  0:0dc9  public  create new project
+  
+  $ hg -R ../test-repo shortlog -G
+  o  1:f649  draft  prelim change
+  |
+  @  0:0dc9  public  create new project
   
 Now let's switch to test-repo to test our change and amend::
   $ cd ../test-repo
   $ hg update -q
+  $ echo 'Fix fix fix' > file1
+  $ hg amend -m'fix bug 37'
   $ echo 'Fix fix fix.' > file1
   $ hg amend -m'fix bug 37'
 
 Figure SG02
-  $ hg shortlog --hidden -G
-  @  2:60ffde5765c5  draft  fix bug 37
+  $ hg -R ../dev-repo shortlog --hidden -G
+  @  1:f649  draft  prelim change
   |
-  | x  1:f6490818a721  draft  prelim change
+  o  0:0dc9  public  create new project
+  
+  $ hg -R ../test-repo shortlog --hidden -G
+  @  3:522d  draft  fix bug 37
+  |
+  | x  2:96d8  draft  fix bug 37
   |/
-  o  0:0dc9c9f6ab91  public  create new project
+  | x  1:f649  draft  prelim change
+  |/
+  o  0:0dc9  public  create new project
   
 Pull into dev-repo: obsolescence markers are transferred, but not
 the new obsolete changeset.
@@ -86,50 +100,56 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
-  1 new obsolescence markers
+  2 new obsolescence markers
   obsoleted 1 changesets
-  new changesets 60ffde5765c5
+  new changesets 522d503432a2
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  updated to "60ffde5765c5: fix bug 37"
+  updated to "522d503432a2: fix bug 37"
   1 other heads for branch "default"
 
 Figure SG03
-  $ hg shortlog --hidden -G
-  @  2:60ffde5765c5  draft  fix bug 37
+  $ hg -R ../dev-repo shortlog --hidden -G
+  @  2:522d  draft  fix bug 37
   |
-  | x  1:f6490818a721  draft  prelim change
+  | x  1:f649  draft  prelim change
   |/
-  o  0:0dc9c9f6ab91  public  create new project
+  o  0:0dc9  public  create new project
   
 Amend again in dev-repo
+  $ echo 'Fix, fix, and fix' > file1
+  $ hg amend
   $ echo 'Fix, fix, and fix.' > file1
   $ hg amend
   $ hg push -q
 
 Figure SG04 (dev-repo)
   $ hg shortlog --hidden -G
-  @  3:de6151c48e1c  draft  fix bug 37
+  @  4:7b49  draft  fix bug 37
   |
-  | x  2:60ffde5765c5  draft  fix bug 37
+  | x  3:e42b  draft  fix bug 37
   |/
-  | x  1:f6490818a721  draft  prelim change
+  | x  2:522d  draft  fix bug 37
   |/
-  o  0:0dc9c9f6ab91  public  create new project
+  | x  1:f649  draft  prelim change
+  |/
+  o  0:0dc9  public  create new project
   
 Figure SG04 (test-repo)
   $ cd ../test-repo
   $ hg update
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  updated to "de6151c48e1c: fix bug 37"
+  updated to "7b49f864d655: fix bug 37"
   1 other heads for branch "default"
   $ hg shortlog --hidden -G
-  @  3:de6151c48e1c  draft  fix bug 37
+  @  4:7b49  draft  fix bug 37
   |
-  | x  2:60ffde5765c5  draft  fix bug 37
+  | x  3:522d  draft  fix bug 37
   |/
-  | x  1:f6490818a721  draft  prelim change
+  | x  2:96d8  draft  fix bug 37
   |/
-  o  0:0dc9c9f6ab91  public  create new project
+  | x  1:f649  draft  prelim change
+  |/
+  o  0:0dc9  public  create new project
   
 This bug fix is finished. We can push it to the public repository.
   $ hg push
@@ -139,23 +159,23 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  2 new obsolescence markers
+  4 new obsolescence markers
 
 Now that the fix is public, we cannot amend it any more.
   $ hg amend -m 'fix bug 37'
-  abort: cannot amend public changesets: de6151c48e1c
+  abort: cannot amend public changesets: 7b49f864d655
   (see 'hg help phases' for details)
   [255]
 
 Figure SG05
   $ hg -R ../public shortlog -G
-  o  1:de6151c48e1c  public  fix bug 37
+  o  1:7b49  public  fix bug 37
   |
-  o  0:0dc9c9f6ab91  public  create new project
+  o  0:0dc9  public  create new project
   
 Oops, still have draft changesets in dev-repo: push the phase change there.
   $ hg -R ../dev-repo shortlog -r 'draft()'
-  3:de6151c48e1c  draft  fix bug 37
+  4:7b49  draft  fix bug 37
   $ hg push ../dev-repo
   pushing to ../dev-repo
   searching for changes
@@ -195,7 +215,7 @@
   added 1 changesets with 1 changes to 1 files
   exporting bookmark bug15
   $ hg -R ../review bookmarks
-     bug15                     2:f91e97234c2b
+     bug15                     2:4e965c66c983
 
 Alice receives code review, amends her fix, and goes out to lunch to
 await second review.
@@ -212,15 +232,15 @@
   obsoleted 1 changesets
   updating bookmark bug15
   $ hg -R ../review bookmarks
-     bug15                     3:cbdfbd5a5db2
+     bug15                     3:3363442626b3
 
 Figure SG06: review repository after Alice pushes her amended changeset.
   $ hg --hidden -R ../review shortlog -G -r 1::
-  o  3:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  o  3:3363  draft  fix bug 15 (v2)
   |
-  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  | x  2:4e96  draft  fix bug 15 (v1)
   |/
-  @  1:de6151c48e1c  public  fix bug 37
+  @  1:7b49  public  fix bug 37
   |
   ~
 
@@ -232,15 +252,15 @@
   $ hg push -B featureX
   pushing to $TESTTMP/review (glob)
   searching for changes
-  remote has heads on branch 'default' that are not known locally: cbdfbd5a5db2
+  remote has heads on branch 'default' that are not known locally: 3363442626b3
   adding changesets
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
   exporting bookmark featureX
   $ hg -R ../review bookmarks
-     bug15                     3:cbdfbd5a5db2
-     featureX                  4:193657d1e852
+     bug15                     3:3363442626b3
+     featureX                  4:c7ff98c7916f
 
 Bob receives first review, amends and pushes.
   $ echo 'do stuff' > file1
@@ -248,7 +268,7 @@
   $ hg push
   pushing to $TESTTMP/review (glob)
   searching for changes
-  remote has heads on branch 'default' that are not known locally: cbdfbd5a5db2
+  remote has heads on branch 'default' that are not known locally: 3363442626b3
   adding changesets
   adding manifests
   adding file changes
@@ -274,7 +294,7 @@
   $ hg push ../review
   pushing to ../review
   searching for changes
-  remote has heads on branch 'default' that are not known locally: cbdfbd5a5db2
+  remote has heads on branch 'default' that are not known locally: 3363442626b3
   adding changesets
   adding manifests
   adding file changes
@@ -283,45 +303,28 @@
   obsoleted 1 changesets
   updating bookmark featureX
   $ hg -R ../review bookmarks
-     bug15                     3:cbdfbd5a5db2
-     featureX                  6:540ba8f317e6
+     bug15                     3:3363442626b3
+     featureX                  6:9d21d673314a
 
 Figure SG07: review and public repos after Bob implements feature X.
   $ hg --hidden -R ../review shortlog -G -r 1::
-  o  6:540ba8f317e6  public  implement feature X (v3)
+  o  6:9d21  public  implement feature X (v3)
   |
-  | x  5:0eb74a7b6698  draft  implement feature X (v2)
+  | x  5:1bb4  draft  implement feature X (v2)
   |/
-  | x  4:193657d1e852  draft  implement feature X (v1)
+  | x  4:c7ff  draft  implement feature X (v1)
   |/
-  | o  3:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  | o  3:3363  draft  fix bug 15 (v2)
   |/
-  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  | x  2:4e96  draft  fix bug 15 (v1)
   |/
-  @  1:de6151c48e1c  public  fix bug 37
+  @  1:7b49  public  fix bug 37
   |
   ~
   $ hg --hidden -R ../public shortlog -G -r 1::
-  o  2:540ba8f317e6  public  implement feature X (v3)
-  |
-  o  1:de6151c48e1c  public  fix bug 37
+  o  2:9d21  public  implement feature X (v3)
   |
-  ~
-
-How do things look in the review repo?
-  $ cd ../review
-  $ hg --hidden shortlog -G -r 1::
-  o  6:540ba8f317e6  public  implement feature X (v3)
-  |
-  | x  5:0eb74a7b6698  draft  implement feature X (v2)
-  |/
-  | x  4:193657d1e852  draft  implement feature X (v1)
-  |/
-  | o  3:cbdfbd5a5db2  draft  fix bug 15 (v2)
-  |/
-  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
-  |/
-  @  1:de6151c48e1c  public  fix bug 37
+  o  1:7b49  public  fix bug 37
   |
   ~
 
@@ -329,20 +332,20 @@
 her change, so now she can publish it.
   $ cd ../alice
   $ hg --hidden shortlog -G -r 1::
-  @  3:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  @  3:3363  draft  fix bug 15 (v2)
   |
-  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  | x  2:4e96  draft  fix bug 15 (v1)
   |/
-  o  1:de6151c48e1c  public  fix bug 37
+  o  1:7b49  public  fix bug 37
   |
   ~
   $ hg outgoing -q ../public
-  3:cbdfbd5a5db2
+  3:3363442626b3
   $ hg push ../public
   pushing to ../public
   searching for changes
-  remote has heads on branch 'default' that are not known locally: 540ba8f317e6
-  abort: push creates new remote head cbdfbd5a5db2 with bookmark 'bug15'!
+  remote has heads on branch 'default' that are not known locally: 9d21d673314a
+  abort: push creates new remote head 3363442626b3 with bookmark 'bug15'!
   (pull and merge or see 'hg help push' for details about pushing new heads)
   [255]
   $ hg pull ../public
@@ -353,30 +356,30 @@
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
   2 new obsolescence markers
-  new changesets 540ba8f317e6
+  new changesets 9d21d673314a
   (run 'hg heads' to see heads, 'hg merge' to merge)
   $ hg log -G -q -r 'head()'
-  o  4:540ba8f317e6
+  o  4:9d21d673314a
   |
   ~
-  @  3:cbdfbd5a5db2
+  @  3:3363442626b3
   |
   ~
   $ hg --hidden shortlog -G -r 1::
-  o  4:540ba8f317e6  public  implement feature X (v3)
+  o  4:9d21  public  implement feature X (v3)
   |
-  | @  3:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  | @  3:3363  draft  fix bug 15 (v2)
   |/
-  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  | x  2:4e96  draft  fix bug 15 (v1)
   |/
-  o  1:de6151c48e1c  public  fix bug 37
+  o  1:7b49  public  fix bug 37
   |
   ~
 
 Alice rebases her draft changeset on top of Bob's public changeset and
 publishes the result.
-  $ hg rebase -d 5
-  rebasing 3:cbdfbd5a5db2 "fix bug 15 (v2)" (bug15)
+  $ hg rebase -d 4
+  rebasing 3:3363442626b3 "fix bug 15 (v2)" (bug15)
   $ hg push ../public
   pushing to ../public
   searching for changes
@@ -398,27 +401,27 @@
 
 Figure SG08: review and public changesets after Alice pushes.
   $ hg --hidden -R ../review shortlog -G -r 1::
-  o  7:a06ec1bf97bd  public  fix bug 15 (v2)
+  o  7:dd15  public  fix bug 15 (v2)
   |
-  o  6:540ba8f317e6  public  implement feature X (v3)
+  o  6:9d21  public  implement feature X (v3)
   |
-  | x  5:0eb74a7b6698  draft  implement feature X (v2)
+  | x  5:1bb4  draft  implement feature X (v2)
   |/
-  | x  4:193657d1e852  draft  implement feature X (v1)
+  | x  4:c7ff  draft  implement feature X (v1)
   |/
-  | x  3:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  | x  3:3363  draft  fix bug 15 (v2)
   |/
-  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  | x  2:4e96  draft  fix bug 15 (v1)
   |/
-  @  1:de6151c48e1c  public  fix bug 37
+  @  1:7b49  public  fix bug 37
   |
   ~
   $ hg --hidden -R ../public shortlog -G -r 1::
-  o  3:a06ec1bf97bd  public  fix bug 15 (v2)
+  o  3:dd15  public  fix bug 15 (v2)
   |
-  o  2:540ba8f317e6  public  implement feature X (v3)
+  o  2:9d21  public  implement feature X (v3)
   |
-  o  1:de6151c48e1c  public  fix bug 37
+  o  1:7b49  public  fix bug 37
   |
   ~
   $ cd ..
@@ -445,7 +448,7 @@
   $ echo 'pretty good fix' >> file1
   $ hg commit -u bob -m 'fix bug 24 (v1)'
   $ hg shortlog -r .
-  4:2fe6c4bd32d0  draft  fix bug 24 (v1)
+  4:b2be  draft  fix bug 24 (v1)
 
 Alice pulls Bob's draft changeset and amends it herself. ::
 
@@ -457,7 +460,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  new changesets 2fe6c4bd32d0
+  new changesets b2be254b3b9f
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ echo 'better fix (alice)' >> file1
   $ hg amend -u alice -m 'fix bug 24 (v2 by alice)'
@@ -468,11 +471,11 @@
   $ echo 'better fix (bob)' >> file1
   $ hg amend -u bob -m 'fix bug 24 (v2 by bob)'
   $ hg --hidden shortlog -G -r 3::
-  @  5:a360947f6faf  draft  fix bug 24 (v2 by bob)
+  @  5:541f  draft  fix bug 24 (v2 by bob)
   |
-  | x  4:2fe6c4bd32d0  draft  fix bug 24 (v1)
+  | x  4:b2be  draft  fix bug 24 (v1)
   |/
-  o  3:a06ec1bf97bd  public  fix bug 15 (v2)
+  o  3:dd15  public  fix bug 15 (v2)
   |
   ~
 
@@ -486,23 +489,23 @@
   added 1 changesets with 1 changes to 1 files (+1 heads)
   1 new obsolescence markers
   2 new content-divergent changesets
-  new changesets e3f99ce9d9cd
+  new changesets e3a586fd2377
   (run 'hg heads' to see heads, 'hg merge' to merge)
 
 Figure SG09: multiple heads! divergence! oh my!
   $ hg --hidden shortlog -G -r 3::
-  *  6:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
+  *  6:e3a5  draft  fix bug 24 (v2 by alice)
   |
-  | @  5:a360947f6faf  draft  fix bug 24 (v2 by bob)
+  | @  5:541f  draft  fix bug 24 (v2 by bob)
   |/
-  | x  4:2fe6c4bd32d0  draft  fix bug 24 (v1)
+  | x  4:b2be  draft  fix bug 24 (v1)
   |/
-  o  3:a06ec1bf97bd  public  fix bug 15 (v2)
+  o  3:dd15  public  fix bug 15 (v2)
   |
   ~
-  $ hg --hidden shortlog -r 'successors(2fe6)'
-  5:a360947f6faf  draft  fix bug 24 (v2 by bob)
-  6:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
+  $ hg --hidden shortlog -r 'successors(b2be)'
+  5:541f  draft  fix bug 24 (v2 by bob)
+  6:e3a5  draft  fix bug 24 (v2 by alice)
 
 Use evolve to fix the divergence.
   $ cat > editor.sh <<EOF
@@ -517,25 +520,25 @@
   with: [6] fix bug 24 (v2 by alice)
   base: [4] fix bug 24 (v1)
   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
-  working directory is now at b1499b0f03ca
+  working directory is now at aa824ceedb8b
   $ hg log -q -r 'contentdivergent()'
 
 Figure SG10: Bob's repository after fixing divergence.
   $ hg --hidden shortlog -G -r 3::
-  @  7:b1499b0f03ca  draft  fix bug 24 (v2 by bob)
+  @  7:aa82  draft  fix bug 24 (v2 by bob)
   |
-  | x  6:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
+  | x  6:e3a5  draft  fix bug 24 (v2 by alice)
   |/
-  | x  5:a360947f6faf  draft  fix bug 24 (v2 by bob)
+  | x  5:541f  draft  fix bug 24 (v2 by bob)
   |/
-  | x  4:2fe6c4bd32d0  draft  fix bug 24 (v1)
+  | x  4:b2be  draft  fix bug 24 (v1)
   |/
-  o  3:a06ec1bf97bd  public  fix bug 15 (v2)
+  o  3:dd15  public  fix bug 15 (v2)
   |
   ~
-  $ hg --hidden shortlog -r 'predecessors(b1499b0f03ca)'
-  5:a360947f6faf  draft  fix bug 24 (v2 by bob)
-  6:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
+  $ hg --hidden shortlog -r 'predecessors(aa82)'
+  5:541f  draft  fix bug 24 (v2 by bob)
+  6:e3a5  draft  fix bug 24 (v2 by alice)
   $ cat file1
   Do stuff.
   pretty good fix
--- a/tests/test-topic.t	Sat Oct 05 13:50:11 2019 -0400
+++ b/tests/test-topic.t	Thu Nov 28 10:54:04 2019 +0100
@@ -128,7 +128,7 @@
   
   (use 'hg help -v topic' to show built-in aliases and global options)
   $ hg help topics
-  hg topics [TOPIC]
+  hg topics [OPTION]... [-r REV]... [TOPIC]
   
   View current topic, set current topic, change topic for a set of revisions, or
   see all topics.
--- a/tests/test-tutorial.t	Sat Oct 05 13:50:11 2019 -0400
+++ b/tests/test-tutorial.t	Thu Nov 28 10:54:04 2019 +0100
@@ -913,7 +913,7 @@
 of the `uncommit` command to splitting a change.
 
   $ hg help uncommit
-  hg uncommit [OPTION]... [NAME]
+  hg uncommit [OPTION]... [FILE]...
   
   move changes from parent revision to working directory
   
@@ -958,7 +958,7 @@
 The tutorial part is not written yet but can use `hg fold`:
 
   $ hg help fold
-  hg fold [OPTION]... [-r] REV
+  hg fold [OPTION]... [-r] REV...
   
   aliases: squash
   
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/testlib/map-hg-rev.sh	Thu Nov 28 10:54:04 2019 +0100
@@ -0,0 +1,15 @@
+#!/bin/sh
+set -eu
+
+case $1 in
+    default)
+        echo default
+        ;;
+    mercurial-*)
+        exp=$(echo "$1" | cut -d- -f2 | sed 's#\.#\\.#g')
+        echo 'max(tag("re:^'"$exp"'"))'
+        ;;
+    *)
+        echo stable
+        ;;
+esac