changeset 4674:3810ca63398f mercurial-4.5

test-compat: merge mercurial-4.6 into mercurial-4.5
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 05 Jun 2019 17:46:06 +0200
parents 3ef4980353af (diff) 6f26dea843d6 (current diff)
children 79bc0f1a832e 7fe0be34f662
files tests/test-discovery-obshashrange.t tests/test-evolve-obshistory-prune.t tests/test-prune.t tests/test-topic-stack.t tests/test-topic-tutorial.t tests/test-topic.t tests/test-userguide.t
diffstat 100 files changed, 4344 insertions(+), 4240 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Tue Apr 23 14:18:11 2019 +0200
+++ b/.hgtags	Wed Jun 05 17:46:06 2019 +0200
@@ -78,3 +78,4 @@
 97b18934d6db9e7e7eaa3fb656c0411d7f43af26 8.3.3
 8c4289d0e91e95b3281c378e1ac3f4ff4678b4d3 8.4.0
 33c617626fd90a0a00e831b4762f64fecb609317 8.5.0
+05c9dcf5512ed77490a35b4d6b1c3fe860259f48 8.5.1
--- a/CHANGELOG	Tue Apr 23 14:18:11 2019 +0200
+++ b/CHANGELOG	Wed Jun 05 17:46:06 2019 +0200
@@ -1,7 +1,25 @@
 Changelog
 =========
 
-8.5.1 - in progress
+8.6.0 - in progress
+-------------------
+
+  * evolve: preserve the working directory after resolving instability (BC)
+            (use `hg next` or `hg evolve --update` to get the old behavior)
+  * evolve: evolve all relevant revision by default (BC)
+            (use --no-all to evolve only one)
+  * evolve: drop compatibility with 4.4
+  * evolve: reinstalled compatibility with narrow repositories,
+  * evolve: use "unstable" instead of "troubled"
+  * evolve: run multiple stabilisation in the same transaction
+  * evolve: improve users merging during content-divergence
+  * obsdiscovery: drop support for deprecated discovery protocol `obshash`
+    (Make sure your servers are configured to use the obshashrange one.
+    It is available in evolve 7.2 and above.)
+  * topic: drop the b# alias. It conflicted with normal hashes.
+  * topic: add a `experimental.topic.allow-publish` option (default: True)
+
+8.5.1 -- 2019-04-23
 -------------------
 
   * evolve: make sure we use upstream merge code with 5.0,
@@ -11,7 +29,7 @@
   * topic: compatibility with mercurial-5.0,
   * topic: improve extensions isolation (issue6121).
 
-8.5.0 -- 2019-04-23
+8.5.0 -- 2019-04-12
 -------------------
 
   * evolve: fix an recoverable state (issue6053),
--- a/debian/changelog	Tue Apr 23 14:18:11 2019 +0200
+++ b/debian/changelog	Wed Jun 05 17:46:06 2019 +0200
@@ -1,4 +1,10 @@
-mercurial-evolve (8.5.0-1) UNRELEASED; urgency=medium
+mercurial-evolve (8.5.1-0) UNRELEASED; urgency=medium
+
+  * new upstream release
+
+ -- Pierre-Yves David <pierre-yves.david@ens-lyon.org>  Tue, 23 Apr 2019 15:30:11 +0200
+
+mercurial-evolve (8.5.0-1) unstable; urgency=medium
 
   * new upstream release
 
--- a/debian/rules	Tue Apr 23 14:18:11 2019 +0200
+++ b/debian/rules	Wed Jun 05 17:46:06 2019 +0200
@@ -6,7 +6,8 @@
 
 override_dh_auto_build:
 	dh_auto_build
-	$(MAKE) -C docs
+	# Workaround for Sphinx in Debian Buster defaulting to Python 3
+	SPHINXBUILD="python -m sphinx -bhtml" $(MAKE) -C docs
 
 hgsrc_defined:
 	# Use "! -z" instead of "-n", because "-n" without arguments is true
--- a/docs/concepts.rst	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/concepts.rst	Wed Jun 05 17:46:06 2019 +0200
@@ -92,8 +92,8 @@
 think of the traditional parent/child DAG as the first derivative of
 your source code, and the obsolescence DAG as the second derivative.)
 
-Troubled changesets (unstable, bumped, divergent)
--------------------------------------------------
+Unstable changesets (orphan, phase-divergent, content-divergent)
+----------------------------------------------------------------
 
 Evolving history can introduce problems that need to be solved. For
 example, if you prune a changeset *P* but not its descendants, those
@@ -102,7 +102,7 @@
 at the same time. But Mercurial does not push obsolete changesets like
 *P*, so it cannot push the descendants of *P*. Any non-obsolete
 changeset that is a descendant of an obsolete changeset is said to be
-*unstable*.
+an *orphan*.
 
   [diagram: obsolete cset with non-obsolete descendant]
 
@@ -116,7 +116,7 @@
 phase and therefore mutable. So Bob amends *C*, which marks it
 obsolete and replaces it with *C'*. When he is back online and pulls
 from the public repository, Mercurial learns that *C* is public, which
-means it cannot be obsolete. We say that *C'* is *bumped*, since it is
+means it cannot be obsolete. We say that *C'* is *phase-divergent*, since it is
 the successor of a public changeset.
 
 .. _`share mutable history`: sharing.html
@@ -125,25 +125,25 @@
 two people have bought tickets for the same seat on a plane and they
 both show up at the airport, only one of them gets on the plane. The
 passenger who is left behind in the airport terminal has been
-"bumped".)
+"phase-divergent".)
 
 The third sort of trouble is when Alice and Bob both amend the same
 changeset *C* to have different successors. When this happens, the
-successors are both called *divergent* (unless one of them is in
-public phase; only mutable changesets are divergent).
+successors are both called *content-divergent* (unless one of them is in
+public phase; only mutable changesets are content-divergent).
 
-The collective term for unstable, bumped, and divergent changeset is
-*troubled*::
+The collective term for orphan, phase-divergent, and content-divergent
+changeset is *unstable*::
 
-  troubled = unstable ∪ bumped ∪ divergent
+  unstable = orphan ∪ phase-divergent ∪ content-divergent
 
-It is possible for a changeset to be in any of the troubled categories
-at the same time: it might be unstable and divergent, or bumped and
-divergent, or whatever.
+It is possible for a changeset to be in any of the unstable categories
+at the same time: it might be an orphan and content-divergent, or
+phase-divergent and content-divergent, or whatever.
 
-  [diagram: Venn diagram of troubled changesets, showing overlap]
+  [diagram: Venn diagram of unstable changesets, showing overlap]
 
-The presence of troubled changesets indicates the need to run ``hg
+The presence of unstable changesets indicates the need to run ``hg
 evolve``.
 
 Hidden (and visible) changesets
@@ -192,7 +192,7 @@
   hidden = hideable ∖ ancestors((repo ∖ hideable) ∪ blockers)
 
 This will probably be clearer with a worked example. First, here's a
-repository with some obsolete changesets, some troubled changesets,
+repository with some obsolete changesets, some unstable changesets,
 one bookmark, a working copy, and some hidden changesets::
 
         x-x
--- a/docs/evolve-faq.rst	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/evolve-faq.rst	Wed Jun 05 17:46:06 2019 +0200
@@ -138,20 +138,20 @@
 You can still use rebase to move a whole segment of the changeset graph together.
 
 .. warning:: Beware that rebasing changesets already obsolete will likely result in
-             divergent versions of the changesets.
+             content-divergent versions of the changesets.
 
-Resolve history troubles: ``evolve``
-------------------------------------
+Resolve history instability: ``evolve``
+---------------------------------------
 
 When you rewrite (amend) a changeset with children without rewriting
-those children you create *unstable* changesets and *suspended
+those children you create *orphan* changesets and *suspended
 obsolete* changesets.
 
 When you are finished amending a given changeset, you will want to
 declare it stable, in other words rebase its former descendants on its
 newest version.
 
-You can also use evolve to solve `bumped` and `divergent` changeset/
+You can also use evolve to solve `phase-divergent` and `content-divergent` changeset/
 
 
 Fix my history afterward: ``prune -n``
@@ -170,7 +170,7 @@
 
 ::
     [alias]
-    odiff = diff --rev 'limit(precursors(.),1)' --rev .
+    odiff = diff --rev 'limit(predecessors(.),1)' --rev .
 
 View obsolete markers
 ---------------------
--- a/docs/figures/figure-ug01.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug01.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -15,7 +15,7 @@
    height="150"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug01.svg">
   <defs
      id="defs4">
@@ -180,8 +180,10 @@
        visible="true"
        enabled="true"
        snapvisiblegridlinesonly="true"
-       originx="0.078084198px"
-       originy="-2924.5747px" />
+       originx="0.078084198"
+       originy="-2924.5747"
+       spacingx="1"
+       spacingy="1" />
   </sodipodi:namedview>
   <metadata
      id="metadata7">
@@ -211,13 +213,12 @@
        id="rect2987"
        style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
-       sodipodi:linespacing="125%"
        id="text5217"
        y="252.23067"
        x="390.00699"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
-         style="stroke:none"
+         style="font-size:12px;line-height:1.25;font-family:sans-serif;stroke:none"
          y="252.23067"
          x="390.00699"
          id="tspan5219"
@@ -235,19 +236,19 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8"
        y="13.894781"
        x="56.792801"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156"
          sodipodi:role="line"
          x="56.792801"
-         y="13.894781">1</tspan></text>
+         y="13.894781"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">1</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
      d="m 21.981735,9.6755275 38.518266,4.2e-6"
      id="path8263"
      inkscape:connector-type="polyline"
@@ -258,16 +259,16 @@
      inkscape:connection-end-point="d4" />
   <text
      xml:space="preserve"
-     style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="46.543751"
      y="42.826393"
      id="text5217-8-0"
-     sodipodi:linespacing="125%"
      transform="scale(0.9999979,1.0000021)"><tspan
        sodipodi:role="line"
        id="tspan8594"
        x="46.543751"
-       y="42.826393">hg commit --amend</tspan></text>
+       y="42.826393"
+       style="font-size:12px;line-height:1.25;font-family:monospace">hg commit --amend</tspan></text>
   <path
      style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
      d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
@@ -298,13 +299,12 @@
        id="rect2987-41"
        style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
-       sodipodi:linespacing="125%"
        id="text5217-7"
        y="252.23067"
        x="390.00699"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
-         style="stroke:none"
+         style="font-size:12px;line-height:1.25;font-family:sans-serif;stroke:none"
          y="252.23067"
          x="390.00699"
          id="tspan5219-3"
@@ -322,16 +322,16 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-7"
        y="121.11791"
        x="65.68634"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="121.11791"
          x="65.68634"
          id="tspan3914"
-         sodipodi:role="line">1'</tspan></text>
+         sodipodi:role="line"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">1'</tspan></text>
   </g>
   <g
      id="g3969"
@@ -355,20 +355,20 @@
        style="fill:none;stroke:#686868;stroke-width:0.68990517;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
        sodipodi:type="star" />
     <text
-       sodipodi:linespacing="125%"
        id="text3957"
        y="84.170212"
        x="69.021271"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="84.170212"
          x="69.021271"
          id="tspan3959"
-         sodipodi:role="line">poof!</tspan></text>
+         sodipodi:role="line"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">poof!</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:url(#linearGradient3986);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 1;stroke-dashoffset:0;marker-mid:none;marker-end:none"
-     d="m 21.990865,103.39791 57.925771,-0.005"
+     style="fill:none;stroke:url(#linearGradient3986);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:1;marker-mid:none;marker-end:none"
+     d="m 21.990865,103.39783 57.926859,-0.006"
      id="path3974"
      inkscape:connector-type="polyline"
      inkscape:connector-curvature="0"
@@ -388,13 +388,13 @@
      inkscape:connection-end-point="d4" />
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="46.760448"
      y="58.872295"
-     id="text5223"
-     sodipodi:linespacing="125%"><tspan
+     id="text5223"><tspan
        sodipodi:role="line"
        id="tspan5227"
        x="46.760448"
-       y="58.872295">(destructive, not using evolve)</tspan></text>
+       y="58.872295"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif">(destructive, not using evolve)</tspan></text>
 </svg>
--- a/docs/figures/figure-ug02.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug02.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -15,7 +15,7 @@
    height="250"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug02.svg">
   <defs
      id="defs4">
@@ -206,14 +206,14 @@
      inkscape:pageshadow="2"
      inkscape:zoom="3.7318511"
      inkscape:cx="113.8845"
-     inkscape:cy="138.3052"
+     inkscape:cy="132.4403"
      inkscape:document-units="px"
      inkscape:current-layer="svg2"
      showgrid="false"
-     inkscape:window-width="974"
-     inkscape:window-height="1048"
-     inkscape:window-x="104"
-     inkscape:window-y="103"
+     inkscape:window-width="1814"
+     inkscape:window-height="950"
+     inkscape:window-x="68"
+     inkscape:window-y="45"
      inkscape:window-maximized="0"
      showguides="false"
      inkscape:snap-global="false"
@@ -228,8 +228,10 @@
        visible="true"
        enabled="true"
        snapvisiblegridlinesonly="true"
-       originx="0.078088198px"
-       originy="-2937.8154px" />
+       originx="0.078088198"
+       originy="-2937.8154"
+       spacingx="1"
+       spacingy="1" />
   </sodipodi:namedview>
   <metadata
      id="metadata7">
@@ -259,13 +261,12 @@
        id="rect2987"
        style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
-       sodipodi:linespacing="125%"
        id="text5217"
        y="252.23067"
        x="390.00699"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
-         style="stroke:none"
+         style="font-size:12px;line-height:1.25;font-family:sans-serif;stroke:none"
          y="252.23067"
          x="390.00699"
          id="tspan5219"
@@ -283,19 +284,19 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8"
        y="13.894781"
        x="56.792801"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156"
          sodipodi:role="line"
          x="56.792801"
-         y="13.894781">1</tspan></text>
+         y="13.894781"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">1</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
      d="m 21.981735,10.916236 38.51827,1e-6"
      id="path8263"
      inkscape:connector-type="polyline"
@@ -315,13 +316,12 @@
        id="rect2987-41"
        style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
-       sodipodi:linespacing="125%"
        id="text5217-7"
        y="252.23067"
        x="390.00699"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
-         style="stroke:none"
+         style="font-size:12px;line-height:1.25;font-family:sans-serif;stroke:none"
          y="252.23067"
          x="390.00699"
          id="tspan5219-3"
@@ -339,19 +339,19 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-7"
        y="144.84122"
        x="67.447083"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="144.84122"
          x="67.447083"
          id="tspan3914"
-         sodipodi:role="line">3</tspan></text>
+         sodipodi:role="line"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">2</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6)"
      d="m 18.903026,154.7407 44.684935,52.70603"
      id="path5012"
      inkscape:connector-type="polyline"
@@ -365,27 +365,27 @@
      transform="translate(1.9995778e-6,23.240701)">
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-0"
        y="42.826412"
        x="46.543755"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="42.826412"
          x="46.543755"
          id="tspan8594"
-         sodipodi:role="line">hg commit --amend</tspan></text>
+         sodipodi:role="line"
+         style="font-size:12px;line-height:1.25;font-family:monospace">hg commit --amend</tspan></text>
     <text
-       sodipodi:linespacing="125%"
        id="text5223"
        y="54.872299"
        x="46.760452"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="54.872299"
          x="46.760452"
          id="tspan5227"
-         sodipodi:role="line">(safe, using evolve)</tspan></text>
+         sodipodi:role="line"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">(safe, using evolve)</tspan></text>
   </g>
   <g
      id="g4022"
@@ -399,19 +399,19 @@
        style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-9"
        y="107.76683"
        x="67.426567"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156-7"
          sodipodi:role="line"
          x="67.426567"
-         y="107.76683">1</tspan></text>
+         y="107.76683"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">1</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.94117647;stroke-dasharray:none;marker-end:url(#Arrow2Mend);display:inline"
+     style="display:inline;fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.94117647;marker-end:url(#Arrow2Mend)"
      d="m 21.991109,145.71407 38.508895,0"
      id="path8263-2"
      inkscape:connector-type="polyline"
@@ -422,54 +422,18 @@
      inkscape:connection-end-point="d4" />
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="122.10091"
      y="140.49216"
-     id="text4115"
-     sodipodi:linespacing="125%"><tspan
+     id="text4115"><tspan
        sodipodi:role="line"
        id="tspan4117"
        x="122.10091"
-       y="140.49216" /></text>
-  <g
-     id="g5472"
-     transform="translate(1.9995778e-6,1.240699)">
-    <rect
-       y="135.44673"
-       x="120.5"
-       height="18.05327"
-       width="21.481739"
-       id="rect2987-4-0-0"
-       style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0" />
-    <text
-       inkscape:transform-center-x="2.6044813"
-       transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
-       id="text5217-8-9-2"
-       y="148.84123"
-       x="127.4267"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
-       xml:space="preserve"><tspan
-         id="tspan6156-7-4"
-         sodipodi:role="line"
-         x="127.4267"
-         y="148.84123">2</tspan></text>
-  </g>
-  <text
-     xml:space="preserve"
-     style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
-     x="140.76923"
-     y="136.65099"
-     id="text4119"
-     sodipodi:linespacing="125%"><tspan
-       sodipodi:role="line"
-       id="tspan4121"
-       x="140.76923"
-       y="136.65099"
-       style="font-size:8px;font-weight:bold;-inkscape-font-specification:Sans Bold">T</tspan></text>
+       y="140.49216"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif"> </tspan></text>
   <path
-     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM)"
-     d="m 71.240874,154.7407 0,52.70603"
+     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
+     d="m 71.240874,154.7407 v 52.70603"
      id="path4123"
      inkscape:connector-type="polyline"
      inkscape:connector-curvature="0"
@@ -479,56 +443,37 @@
      inkscape:connection-end-point="d4" />
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
-     x="175.07857"
-     y="112.16577"
-     id="text4787"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       x="175.07857"
-       y="112.16577"
-       id="tspan4791">temporary</tspan><tspan
-       sodipodi:role="line"
-       x="175.07857"
-       y="122.16577"
-       id="tspan4795">amend</tspan><tspan
-       sodipodi:role="line"
-       x="175.07857"
-       y="132.16577"
-       id="tspan4797">commit</tspan></text>
-  <text
-     xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="51.716301"
      y="112.74194"
-     id="text4799"
-     sodipodi:linespacing="125%"><tspan
+     id="text4799"><tspan
        sodipodi:role="line"
        id="tspan4801"
        x="51.716301"
-       y="112.74194">obsolete (and hidden)</tspan></text>
+       y="112.74194"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif">obsolete (and hidden)</tspan></text>
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="94.602974"
      y="171.26965"
-     id="text4803"
-     sodipodi:linespacing="125%"><tspan
+     id="text4803"><tspan
        sodipodi:role="line"
        id="tspan4805"
        x="94.602974"
-       y="171.26965">precursor</tspan></text>
+       y="171.26965"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif">predecessor</tspan></text>
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="94.461372"
      y="189.68568"
-     id="text4807"
-     sodipodi:linespacing="125%"><tspan
+     id="text4807"><tspan
        sodipodi:role="line"
        id="tspan4809"
        x="94.461372"
-       y="189.68568">successor</tspan></text>
+       y="189.68568"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif">successor</tspan></text>
   <path
      style="fill:none;stroke:#7d7d7d;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
      d="M 92.837054,168.99918 C 80.990247,168.9329 79.499863,165.60079 77.196029,156.38545"
@@ -540,20 +485,10 @@
      id="path5263"
      inkscape:connector-curvature="0" />
   <path
-     style="fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
-     d="m 173.06037,115.51697 c -10.90807,9.681 -3.90454,20.30854 -25.22746,18.66832"
-     id="path5689"
-     inkscape:connector-curvature="0" />
-  <path
      style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
      d="m 97.377997,116.02152 c 1.765752,12.09244 -25.911587,2.23195 -29.768403,17.65922"
      id="path5893"
      inkscape:connector-curvature="0" />
-  <path
-     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-     d="m 99.093394,115.78744 c -1.76575,12.09244 25.911586,2.23195 29.768406,17.65922"
-     id="path5893-7"
-     inkscape:connector-curvature="0" />
   <g
      id="g6493"
      transform="translate(1.9995778e-6,1.240701)">
@@ -577,14 +512,4 @@
          inkscape:connector-curvature="0" />
     </g>
   </g>
-  <path
-     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#Arrow2Mend-2)"
-     d="m 81.981743,145.71407 38.518257,0"
-     id="path3069"
-     inkscape:connector-type="polyline"
-     inkscape:connector-curvature="0"
-     inkscape:connection-start="#g4022"
-     inkscape:connection-start-point="d4"
-     inkscape:connection-end="#g5472"
-     inkscape:connection-end-point="d4" />
 </svg>
--- a/docs/figures/figure-ug03.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug03.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -15,7 +15,7 @@
    height="150"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug03.svg">
   <defs
      id="defs4">
@@ -172,8 +172,10 @@
        visible="true"
        enabled="true"
        snapvisiblegridlinesonly="true"
-       originx="0.078084198px"
-       originy="-2924.5747px" />
+       originx="0.078084198"
+       originy="-2924.5747"
+       spacingx="1"
+       spacingy="1" />
   </sodipodi:namedview>
   <metadata
      id="metadata7">
@@ -206,17 +208,16 @@
          y="0.64889121" />
       <text
          xml:space="preserve"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="7.4264359"
          y="14.043668"
          id="text5217"
-         sodipodi:linespacing="125%"
          transform="scale(0.9999979,1.0000021)"><tspan
            sodipodi:role="line"
            id="tspan5219"
            x="7.4264359"
            y="14.043668"
-           style="stroke:none">3</tspan></text>
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif;stroke:none">3</tspan></text>
     </g>
     <g
        id="g6612">
@@ -229,39 +230,39 @@
          y="0.64889765" />
       <text
          xml:space="preserve"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="67.426567"
          y="14.043674"
          id="text5217-8"
-         sodipodi:linespacing="125%"
          transform="scale(0.9999979,1.0000021)"><tspan
            y="14.043674"
            x="67.426567"
            sodipodi:role="line"
-           id="tspan3900">4</tspan></text>
+           id="tspan3900"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">4</tspan></text>
     </g>
     <path
        inkscape:connector-curvature="0"
        inkscape:connector-type="polyline"
        id="path8263"
        d="m 21.981735,9.6755275 38.518266,4.2e-6"
-       style="fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline" />
+       style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
   </g>
   <g
      id="g6397"
      transform="translate(1.2139669,17.353636)">
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-0"
        y="53.910118"
        x="46.543751"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="53.910118"
          x="46.543751"
          id="tspan8594"
-         sodipodi:role="line">hg prune .</tspan></text>
+         sodipodi:role="line"
+         style="font-size:12px;line-height:1.25;font-family:monospace">hg prune .</tspan></text>
     <g
        id="g6372">
       <path
@@ -296,14 +297,13 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-9"
        y="115.1729"
        x="7.4264359"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan3904"
-         style="stroke:none"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif;stroke:none"
          y="115.1729"
          x="7.4264359"
          sodipodi:role="line">3</tspan></text>
@@ -319,20 +319,20 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999791,1.99999583;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-2"
        y="115.1729"
        x="67.426567"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan3908"
          sodipodi:role="line"
          x="67.426567"
-         y="115.1729">4</tspan></text>
+         y="115.1729"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">4</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
-     d="m 21.981736,110.80498 38.518268,0"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+     d="M 21.981736,110.80498 H 60.500004"
      id="path8263-2"
      inkscape:connector-type="polyline"
      inkscape:connector-curvature="0"
@@ -342,48 +342,47 @@
      inkscape:connection-end-point="d4" />
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="120.84515"
      y="108.62753"
-     id="text4799"
-     sodipodi:linespacing="100%"><tspan
+     id="text4799"><tspan
        sodipodi:role="line"
        id="tspan4801"
        x="120.84515"
        y="108.62753"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans Italic">obsolete,</tspan><tspan
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;writing-mode:lr-tb;text-anchor:start">obsolete,</tspan><tspan
        sodipodi:role="line"
        x="120.84515"
        y="118.62753"
        id="tspan4155"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans Italic">hidden,</tspan><tspan
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;writing-mode:lr-tb;text-anchor:start">hidden,</tspan><tspan
        sodipodi:role="line"
        x="120.84515"
        y="128.62753"
        id="tspan4157"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans Italic">no successors</tspan></text>
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;writing-mode:lr-tb;text-anchor:start">no successors</tspan></text>
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="87.810272"
      y="8.7751856"
-     id="text4353"
-     sodipodi:linespacing="125%"><tspan
+     id="text4353"><tspan
        sodipodi:role="line"
        id="tspan4355"
        x="87.810272"
-       y="8.7751856">working dir</tspan></text>
+       y="8.7751856"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif">working dir</tspan></text>
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="20.528839"
      y="144.07831"
-     id="text4353-8"
-     sodipodi:linespacing="125%"><tspan
+     id="text4353-8"><tspan
        sodipodi:role="line"
        id="tspan4355-6"
        x="20.528839"
-       y="144.07831">working dir</tspan></text>
+       y="144.07831"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif">working dir</tspan></text>
   <path
      style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-7)"
      d="m 20.030453,140.89525 c -8.427525,-2.11036 -7.688456,-10.62543 -7.688456,-18.00718"
--- a/docs/figures/figure-ug04.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug04.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -15,7 +15,7 @@
    height="205"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug04.svg">
   <defs
      id="defs4">
@@ -228,8 +228,10 @@
        visible="true"
        enabled="true"
        snapvisiblegridlinesonly="true"
-       originx="0.078090195px"
-       originy="-3032.6372px" />
+       originx="0.078090195"
+       originy="-3032.6372"
+       spacingx="1"
+       spacingy="1" />
   </sodipodi:namedview>
   <metadata
      id="metadata7">
@@ -260,13 +262,12 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999779;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999978,1.0000022)"
-       sodipodi:linespacing="125%"
        id="text5217"
        y="14.714343"
        x="7.426435"
-       style="font-size:11.9999733px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
-         style="stroke:none"
+         style="font-size:11.9999733px;line-height:1.25;font-family:sans-serif;stroke:none"
          y="14.714343"
          x="7.426435"
          id="tspan5219"
@@ -284,19 +285,19 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999779;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999978,1.0000022)"
-       sodipodi:linespacing="125%"
        id="text5217-8"
        y="14.714343"
        x="67.426567"
-       style="font-size:11.9999733px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156"
          sodipodi:role="line"
          x="67.426567"
-         y="14.714343">5</tspan></text>
+         y="14.714343"
+         style="font-size:11.9999733px;line-height:1.25;font-family:sans-serif">5</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:0.99999779px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999779px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
      d="m 21.981731,10.168036 38.518259,10e-7"
      id="path8263"
      inkscape:connector-type="polyline"
@@ -316,16 +317,15 @@
          y="238.83586" />
       <text
          xml:space="preserve"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="390.00699"
          y="252.23067"
-         id="text5217-7"
-         sodipodi:linespacing="125%"><tspan
+         id="text5217-7"><tspan
            sodipodi:role="line"
            id="tspan5219-3"
            x="390.00699"
            y="252.23067"
-           style="stroke:none">3</tspan></text>
+           style="font-size:12px;line-height:1.25;font-family:sans-serif;stroke:none">3</tspan></text>
     </g>
   </g>
   <g
@@ -343,20 +343,20 @@
          y="131.44673" />
       <text
          xml:space="preserve"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="67.447083"
          y="144.84122"
          id="text5217-8-7"
-         sodipodi:linespacing="125%"
          transform="scale(0.9999979,1.0000021)"><tspan
            sodipodi:role="line"
            id="tspan3914"
            x="67.447083"
-           y="144.84122">6</tspan></text>
+           y="144.84122"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">6</tspan></text>
     </g>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6)"
      d="m 18.903021,117.9925 44.684942,52.70603"
      id="path5012"
      inkscape:connector-type="polyline"
@@ -380,74 +380,74 @@
          y="94.372253" />
       <text
          xml:space="preserve"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none"
          x="67.426567"
          y="107.76683"
          id="text5217-8-9"
-         sodipodi:linespacing="125%"
          transform="scale(0.9999979,1.0000021)"><tspan
            y="107.76683"
            x="67.426567"
            sodipodi:role="line"
-           id="tspan6156-7">5</tspan></text>
+           id="tspan6156-7"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">5</tspan></text>
     </g>
   </g>
   <path
-     style="fill:none;stroke:#404040;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.94117647;stroke-dasharray:none;marker-end:url(#Arrow2Mend);display:inline"
-     d="m 21.991099,108.96587 38.508907,0"
+     style="display:inline;fill:none;stroke:#404040;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.94117647;marker-end:url(#Arrow2Mend)"
+     d="M 21.991099,108.96587 H 60.500006"
      id="path8263-2"
      inkscape:connector-type="polyline"
      inkscape:connector-curvature="0" />
   <text
      xml:space="preserve"
-     style="font-size:9.99999905px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="122.10089"
      y="139.74393"
-     id="text4115"
-     sodipodi:linespacing="125%"><tspan
+     id="text4115"><tspan
        sodipodi:role="line"
        id="tspan4117"
        x="122.10089"
-       y="139.74393" /></text>
+       y="139.74393"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif"> </tspan></text>
   <path
-     style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM)"
-     d="m 71.240876,117.9925 0,52.70603"
+     style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
+     d="m 71.240876,117.9925 v 52.70603"
      id="path4123"
      inkscape:connector-type="polyline"
      inkscape:connector-curvature="0" />
   <text
      xml:space="preserve"
-     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="131.67636"
      y="97.973274"
-     id="text4799"
-     sodipodi:linespacing="125%"><tspan
+     id="text4799"><tspan
        sodipodi:role="line"
        id="tspan4801"
        x="131.67636"
-       y="97.973274">obsolete, hidden</tspan></text>
+       y="97.973274"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">obsolete, hidden</tspan></text>
   <text
      xml:space="preserve"
-     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="94.602959"
      y="134.52141"
-     id="text4803"
-     sodipodi:linespacing="125%"><tspan
+     id="text4803"><tspan
        sodipodi:role="line"
        id="tspan4805"
        x="94.602959"
-       y="134.52141">precursor</tspan></text>
+       y="134.52141"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">predecessor</tspan></text>
   <text
      xml:space="preserve"
-     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="94.461357"
      y="152.93744"
-     id="text4807"
-     sodipodi:linespacing="125%"><tspan
+     id="text4807"><tspan
        sodipodi:role="line"
        id="tspan4809"
        x="94.461357"
-       y="152.93744">successor</tspan></text>
+       y="152.93744"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">successor</tspan></text>
   <path
      style="fill:none;stroke:#7d7d7d;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
      d="M 92.83703,132.25098 C 80.990226,132.18468 79.499843,128.85259 77.19601,119.63725"
@@ -460,34 +460,36 @@
      inkscape:connector-curvature="0" />
   <text
      xml:space="preserve"
-     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="131.8273"
      y="14.09236"
-     id="text4799-8"
-     sodipodi:linespacing="125%"><tspan
+     id="text4799-8"><tspan
        sodipodi:role="line"
        id="tspan4801-4"
        x="131.8273"
-       y="14.09236">working dir (clean)</tspan></text>
+       y="14.09236"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">working dir (clean)</tspan></text>
   <text
      xml:space="preserve"
-     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="133.3548"
      y="177.91992"
-     id="text4799-8-1"
-     sodipodi:linespacing="125%"><tspan
+     id="text4799-8-1"><tspan
        sodipodi:role="line"
        x="133.3548"
        y="177.91992"
-       id="tspan3129">working dir</tspan><tspan
+       id="tspan3129"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">working dir</tspan><tspan
        sodipodi:role="line"
        x="133.3548"
        y="190.41992"
-       id="tspan3137">(with uncommitted</tspan><tspan
+       id="tspan3137"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">(with uncommitted</tspan><tspan
        sodipodi:role="line"
        x="133.3548"
        y="202.91992"
-       id="tspan3135">changes to f1 f2 ...)</tspan></text>
+       id="tspan3135"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">changes to f1 f2 ...)</tspan></text>
   <path
      style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
      d="M 127.70873,11.814007 C 109.60365,21.89832 105.56713,4.2966494 86.402349,8.4033887"
@@ -503,18 +505,18 @@
      transform="translate(1.9967556e-6,-0.17817035)">
     <text
        transform="scale(0.9999978,1.0000022)"
-       sodipodi:linespacing="125%"
        id="text5217-8-0"
        y="58.841717"
        x="46.92271"
-       style="font-size:11.99999809px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="58.841717"
          x="46.92271"
          id="tspan8594"
-         sodipodi:role="line">hg uncommit <tspan
+         sodipodi:role="line"
+         style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg uncommit <tspan
    id="tspan3131"
-   style="font-style:italic">f1 f2 ...</tspan></tspan></text>
+   style="font-style:italic;font-family:monospace">f1 f2 ...</tspan></tspan></text>
     <g
        transform="translate(-0.59241834,4.9316169)"
        id="g6372">
--- a/docs/figures/figure-ug05.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug05.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -15,7 +15,7 @@
    height="250"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug05.svg">
   <defs
      id="defs4">
@@ -284,8 +284,10 @@
        visible="true"
        enabled="true"
        snapvisiblegridlinesonly="true"
-       originx="0.078088198px"
-       originy="-2937.8154px" />
+       originx="0.078088198"
+       originy="-2937.8154"
+       spacingx="1"
+       spacingy="1" />
   </sodipodi:namedview>
   <metadata
      id="metadata7">
@@ -314,13 +316,12 @@
        id="rect2987"
        style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
-       sodipodi:linespacing="125%"
        id="text5217"
        y="14.841532"
        x="7.4264469"
-       style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
-         style="stroke:none"
+         style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif;stroke:none"
          y="14.841532"
          x="7.4264469"
          id="tspan5219"
@@ -340,20 +341,20 @@
          y="1.8896017" />
       <text
          xml:space="preserve"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="67.426575"
          y="15.284375"
          id="text5217-8"
-         sodipodi:linespacing="125%"
          transform="scale(0.9999979,1.0000021)"><tspan
            y="15.284375"
            x="67.426575"
            sodipodi:role="line"
-           id="tspan6156">7</tspan></text>
+           id="tspan6156"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">7</tspan></text>
     </g>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:0.99999946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
      d="m 21.981805,10.473365 38.518392,1e-6"
      id="path8263"
      inkscape:connector-type="polyline"
@@ -370,13 +371,12 @@
        style="fill:none;stroke:#000000;stroke-width:1.0000037;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(1.0000037,0.99999628)"
-       sodipodi:linespacing="125%"
        id="text5217-7"
        y="150.08279"
        x="7.3916588"
-       style="font-size:12.00004482px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
-         style="stroke:none"
+         style="font-size:12.00004482px;line-height:1.25;font-family:sans-serif;stroke:none"
          y="150.08279"
          x="7.3916588"
          id="tspan5219-3"
@@ -394,19 +394,19 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-7"
        y="232.20978"
        x="112.22823"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="232.20978"
          x="112.22823"
          id="tspan3914"
-         sodipodi:role="line">10</tspan></text>
+         sodipodi:role="line"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">10</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6)"
      d="m 18.241201,159.5 45.999463,59.31546"
      id="path5012"
      inkscape:connector-type="polyline"
@@ -417,18 +417,18 @@
      inkscape:connection-end-point="d4" />
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="122.10091"
      y="140.49216"
-     id="text4115"
-     sodipodi:linespacing="125%"><tspan
+     id="text4115"><tspan
        sodipodi:role="line"
        id="tspan4117"
        x="122.10091"
-       y="140.49216" /></text>
+       y="140.49216"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif"> </tspan></text>
   <path
-     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
-     d="m 71.240899,159.5 -2.6e-5,59.31546"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
+     d="m 71.305628,159.5 -0.05621,59.31546"
      id="path4123"
      inkscape:connector-type="polyline"
      inkscape:connector-curvature="0"
@@ -438,41 +438,41 @@
      inkscape:connection-start-point="d4" />
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="145.71631"
      y="120.74194"
-     id="text4799"
-     sodipodi:linespacing="125%"><tspan
+     id="text4799"><tspan
        sodipodi:role="line"
        x="145.71631"
        y="120.74194"
-       id="tspan4866">obsolete, hidden precursors</tspan></text>
+       id="tspan4866"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif">obsolete, hidden predecessors</tspan></text>
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="140.08366"
      y="221.99774"
-     id="text4807"
-     sodipodi:linespacing="125%"><tspan
+     id="text4807"><tspan
        sodipodi:role="line"
        id="tspan4809"
        x="140.08366"
-       y="221.99774">successor, working dir</tspan></text>
+       y="221.99774"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif">successor, working dir</tspan></text>
   <g
      id="g4748"
      transform="translate(66,4)">
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-0"
        y="75.774689"
        x="46.543758"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="75.774689"
          x="46.543758"
          id="tspan8594"
-         sodipodi:role="line">hg fold 7</tspan></text>
+         sodipodi:role="line"
+         style="font-size:12px;line-height:1.25;font-family:monospace">hg fold 7</tspan></text>
     <g
        transform="translate(1.9995778e-6,1.240701)"
        id="g6493">
@@ -511,16 +511,16 @@
          y="1.8896017" />
       <text
          xml:space="preserve"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="67.426575"
          y="15.284375"
          id="text5217-8-72"
-         sodipodi:linespacing="125%"
          transform="scale(0.9999979,1.0000021)"><tspan
            y="15.284375"
            x="67.426575"
            sodipodi:role="line"
-           id="tspan6156-9">8</tspan></text>
+           id="tspan6156-9"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">8</tspan></text>
     </g>
   </g>
   <g
@@ -537,16 +537,16 @@
          y="1.8896017" />
       <text
          xml:space="preserve"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="67.426575"
          y="15.284375"
          id="text5217-8-3"
-         sodipodi:linespacing="125%"
          transform="scale(0.9999979,1.0000021)"><tspan
            y="15.284375"
            x="67.426575"
            sodipodi:role="line"
-           id="tspan6156-0">9</tspan></text>
+           id="tspan6156-0"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">9</tspan></text>
     </g>
   </g>
   <path
@@ -561,7 +561,7 @@
      inkscape:connection-end-point="d4" />
   <path
      style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
-     d="m 141.98174,10.473366 38.51826,0"
+     d="M 141.98174,10.473366 H 180.5"
      id="path3180"
      inkscape:connector-type="polyline"
      inkscape:connector-curvature="0"
@@ -579,16 +579,16 @@
        id="rect2987-4-7"
        style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.9999994, 2.99999821;stroke-dashoffset:0" />
     <text
-       sodipodi:linespacing="125%"
        id="text5217-8-1"
        y="154.84146"
        x="67.426483"
-       style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156-7"
          sodipodi:role="line"
          x="67.426483"
-         y="154.84146">7</tspan></text>
+         y="154.84146"
+         style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">7</tspan></text>
   </g>
   <g
      id="g4842">
@@ -601,16 +601,16 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999791, 2.99999374;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-72-7"
        y="154.84122"
        x="127.42651"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156-9-5"
          sodipodi:role="line"
          x="127.42651"
-         y="154.84122">8</tspan></text>
+         y="154.84122"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">8</tspan></text>
   </g>
   <g
      id="g4847">
@@ -623,19 +623,19 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999791, 2.99999374;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-3-2"
        y="154.84122"
        x="187.42664"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156-0-8"
          sodipodi:role="line"
          x="187.42664"
-         y="154.84122">9</tspan></text>
+         y="154.84122"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">9</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
      d="m 81.981806,150.47337 38.518004,0"
      id="path3178-7"
      inkscape:connector-type="polyline"
@@ -645,8 +645,8 @@
      inkscape:connection-end="#g4842"
      inkscape:connection-end-point="d4" />
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
-     d="m 141.98155,150.47337 38.51827,0"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+     d="m 141.98155,150.47337 h 38.51827"
      id="path3180-3"
      inkscape:connector-type="polyline"
      inkscape:connector-curvature="0"
@@ -655,7 +655,7 @@
      inkscape:connection-end="#g4847"
      inkscape:connection-end-point="d4" />
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448)"
      d="M 21.981991,150.47336 60.5,150.47337"
      id="path4542"
      inkscape:connector-type="polyline"
@@ -665,7 +665,7 @@
      inkscape:connection-end="#g4837"
      inkscape:connection-end-point="d4" />
   <path
-     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
      d="M 124.24048,159.5 78.241066,218.81546"
      id="path4123-2"
      inkscape:connector-type="polyline"
@@ -675,7 +675,7 @@
      inkscape:connection-end="#g4533"
      inkscape:connection-end-point="d4" />
   <path
-     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
      d="M 180.49982,157.39844 81.981738,220.91702"
      id="path4123-2-7"
      inkscape:connector-type="polyline"
@@ -706,15 +706,15 @@
      inkscape:connector-curvature="0" />
   <text
      xml:space="preserve"
-     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="219.76105"
      y="45.381439"
-     id="text4799-8"
-     sodipodi:linespacing="125%"><tspan
+     id="text4799-8"><tspan
        sodipodi:role="line"
        id="tspan4801-4"
        x="219.76105"
-       y="45.381439">working dir</tspan></text>
+       y="45.381439"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">working dir</tspan></text>
   <path
      style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#marker4448)"
      d="m 216.5322,43.418725 c -17.12038,-3.247846 -32.15429,-0.004 -25.47437,-18.707746"
--- a/docs/figures/figure-ug06.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug06.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -15,7 +15,7 @@
    height="310"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug06.svg">
   <defs
      id="defs4">
@@ -331,15 +331,15 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="2"
-     inkscape:cx="124.00649"
+     inkscape:cx="126.00649"
      inkscape:cy="153.46969"
      inkscape:document-units="px"
      inkscape:current-layer="svg2"
      showgrid="false"
-     inkscape:window-width="974"
-     inkscape:window-height="1048"
-     inkscape:window-x="48"
-     inkscape:window-y="61"
+     inkscape:window-width="1814"
+     inkscape:window-height="950"
+     inkscape:window-x="77"
+     inkscape:window-y="62"
      inkscape:window-maximized="0"
      showguides="false"
      inkscape:snap-global="false"
@@ -354,8 +354,10 @@
        visible="true"
        enabled="true"
        snapvisiblegridlinesonly="true"
-       originx="0.078088198px"
-       originy="-2937.8154px" />
+       originx="0.078088198"
+       originy="-2937.8154"
+       spacingx="1"
+       spacingy="1" />
   </sodipodi:namedview>
   <metadata
      id="metadata7">
@@ -371,16 +373,16 @@
   </metadata>
   <text
      xml:space="preserve"
-     style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="112.5439"
      y="113.7746"
      id="text5217-8-0"
-     sodipodi:linespacing="125%"
      transform="scale(0.9999979,1.0000021)"><tspan
        sodipodi:role="line"
        id="tspan8594"
        x="112.5439"
-       y="113.7746">hg amend</tspan></text>
+       y="113.7746"
+       style="font-size:12px;line-height:1.25;font-family:monospace">hg amend</tspan></text>
   <g
      id="g6493"
      transform="translate(63.844066,39.240701)">
@@ -418,16 +420,15 @@
      y="35.446732" />
   <text
      xml:space="preserve"
-     style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="3.3424675"
      y="48.84153"
-     id="text5217"
-     sodipodi:linespacing="125%"><tspan
+     id="text5217"><tspan
        sodipodi:role="line"
        id="tspan5219"
        x="3.3424675"
        y="48.84153"
-       style="stroke:none">10</tspan></text>
+       style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif;stroke:none">10</tspan></text>
   <rect
      style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
      id="rect2987-4"
@@ -437,17 +438,17 @@
      y="35.446732" />
   <text
      xml:space="preserve"
-     style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="63.497932"
      y="48.84153"
-     id="text5217-8"
-     sodipodi:linespacing="125%"><tspan
+     id="text5217-8"><tspan
        y="48.84153"
        x="63.497932"
        sodipodi:role="line"
-       id="tspan6156">11</tspan></text>
+       id="tspan6156"
+       style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">11</tspan></text>
   <path
-     style="fill:none;stroke:#000000;stroke-width:0.99999946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
      d="m 21.981805,44.473365 38.518386,10e-7"
      id="path8263"
      inkscape:connector-type="polyline"
@@ -466,13 +467,12 @@
        style="fill:none;stroke:#000000;stroke-width:1.0000037;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(1.0000037,0.9999963)"
-       sodipodi:linespacing="125%"
        id="text5217-7"
        y="154.84212"
        x="3.3424876"
-       style="font-size:12.00004482px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
-         style="stroke:none"
+         style="font-size:12.00004482px;line-height:1.25;font-family:sans-serif;stroke:none"
          y="154.84212"
          x="3.3424876"
          id="tspan5219-3"
@@ -487,18 +487,18 @@
      y="252.81546" />
   <text
      xml:space="preserve"
-     style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="63.342594"
      y="266.20969"
      id="text5217-8-7"
-     sodipodi:linespacing="125%"
      transform="scale(0.9999979,1.0000021)"><tspan
        sodipodi:role="line"
        id="tspan3914"
        x="63.342594"
-       y="266.20969">15</tspan></text>
+       y="266.20969"
+       style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">14</tspan></text>
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6)"
      d="m 18.241201,193.5 45.999463,59.31546"
      id="path5012"
      inkscape:connector-type="polyline"
@@ -509,15 +509,15 @@
      inkscape:connection-start-point="d4" />
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="122.10091"
      y="174.49216"
-     id="text4115"
-     sodipodi:linespacing="125%"><tspan
+     id="text4115"><tspan
        sodipodi:role="line"
        id="tspan4117"
        x="122.10091"
-       y="174.49216" /></text>
+       y="174.49216"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif"> </tspan></text>
   <g
      id="g3118"
      transform="translate(0,34)">
@@ -530,16 +530,16 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-72"
        y="14.841505"
        x="123.54487"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156-9"
          sodipodi:role="line"
          x="123.54487"
-         y="14.841505">12</tspan></text>
+         y="14.841505"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">12</tspan></text>
   </g>
   <g
      id="g3126"
@@ -553,19 +553,19 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-3"
        y="14.841505"
        x="183.42488"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156-0"
          sodipodi:role="line"
          x="183.42488"
-         y="14.841505">13</tspan></text>
+         y="14.841505"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">13</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
      d="m 81.981997,44.473366 38.518003,0"
      id="path3178"
      inkscape:connector-type="polyline"
@@ -575,7 +575,7 @@
      inkscape:connection-end="#g3118"
      inkscape:connection-end-point="d4" />
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
      d="m 141.98174,44.473366 38.51826,0"
      id="path3180"
      inkscape:connector-type="polyline"
@@ -585,7 +585,7 @@
      inkscape:connection-end="#g3126"
      inkscape:connection-end-point="d4" />
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448)"
      d="M 21.981991,184.65238 60.5,185.29435"
      id="path4542"
      inkscape:connector-type="polyline"
@@ -594,27 +594,30 @@
      inkscape:connection-start-point="d4" />
   <text
      xml:space="preserve"
-     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="86.768402"
      y="12.367264"
-     id="text4799-8"
-     sodipodi:linespacing="125%"><tspan
+     id="text4799-8"><tspan
        sodipodi:role="line"
        id="tspan4801-4"
        x="86.768402"
-       y="12.367264">working dir</tspan></text>
+       y="12.367264"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">working dir</tspan></text>
   <flowRoot
      xml:space="preserve"
      id="flowRoot3104"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      transform="translate(0,34)"><flowRegion
-       id="flowRegion3106"><rect
+       id="flowRegion3106"
+       style="font-family:sans-serif"><rect
          id="rect3108"
          width="60.309383"
          height="49.300529"
          x="-25.368233"
-         y="-22.34952" /></flowRegion><flowPara
-       id="flowPara3110"></flowPara></flowRoot>  <g
+         y="-22.34952"
+         style="font-family:sans-serif" /></flowRegion><flowPara
+       id="flowPara3110"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif"> </flowPara></flowRoot>  <g
      id="g5560"
      transform="translate(0,34)">
     <rect
@@ -625,16 +628,16 @@
        id="rect2987-4-8"
        style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
     <text
-       sodipodi:linespacing="125%"
        id="text5217-8-4"
        y="154.84152"
        x="63.497734"
-       style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156-4"
          sodipodi:role="line"
          x="63.497734"
-         y="154.84152">11</tspan></text>
+         y="154.84152"
+         style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">11</tspan></text>
   </g>
   <g
      transform="translate(-2.0371355e-4,174)"
@@ -648,16 +651,16 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-72-7"
        y="14.841505"
        x="123.54487"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156-9-7"
          sodipodi:role="line"
          x="123.54487"
-         y="14.841505">12</tspan></text>
+         y="14.841505"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">12</tspan></text>
   </g>
   <g
      transform="translate(-2.0371355e-4,174)"
@@ -671,19 +674,19 @@
        style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
     <text
        transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
        id="text5217-8-3-9"
        y="14.841505"
        x="183.42488"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156-0-0"
          sodipodi:role="line"
          x="183.42488"
-         y="14.841505">13</tspan></text>
+         y="14.841505"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">13</tspan></text>
   </g>
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
      d="m 81.981806,184.47337 38.517994,0"
      id="path3178-0"
      inkscape:connector-type="polyline"
@@ -691,8 +694,8 @@
      inkscape:connection-end="#g3118-0"
      inkscape:connection-end-point="d4" />
   <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
-     d="m 141.98154,184.47337 38.51826,0"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+     d="M 141.98154,184.47337 H 180.4998"
      id="path3180-2"
      inkscape:connector-type="polyline"
      inkscape:connector-curvature="0"
@@ -701,7 +704,7 @@
      inkscape:connection-end="#g3126-3"
      inkscape:connection-end-point="d4" />
   <path
-     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+     style="display:inline;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
      d="m 71.240899,193.5 -2.6e-5,59.31546"
      id="path4123"
      inkscape:connector-type="polyline"
@@ -710,30 +713,31 @@
      inkscape:connection-end-point="d4" />
   <text
      xml:space="preserve"
-     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="18.790892"
      y="142.23888"
-     id="text4799-8-6"
-     sodipodi:linespacing="100%"><tspan
+     id="text4799-8-6"><tspan
        sodipodi:role="line"
        id="tspan4801-4-0"
        x="18.790892"
-       y="142.23888">obsolete</tspan><tspan
+       y="142.23888"
+       style="font-size:9.99999905px;line-height:1;font-family:sans-serif">obsolete</tspan><tspan
        sodipodi:role="line"
        x="18.790892"
        y="152.23888"
-       id="tspan4452">but visible</tspan></text>
+       id="tspan4452"
+       style="font-size:9.99999905px;line-height:1;font-family:sans-serif">but visible</tspan></text>
   <text
      xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="150.66776"
      y="148.39902"
-     id="text4454"
-     sodipodi:linespacing="125%"><tspan
+     id="text4454"><tspan
        sodipodi:role="line"
        id="tspan4456"
        x="150.66776"
-       y="148.39902">unstable</tspan></text>
+       y="148.39902"
+       style="font-size:10px;line-height:1.25;font-family:sans-serif">orphan</tspan></text>
   <path
      style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker3230);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
      d="m 41.433633,155.93241 c 4.445697,11.92656 24.017716,1.13391 25.948336,14.64825"
@@ -749,90 +753,17 @@
      d="m 174.94201,152.58423 c 1.6786,11.87585 15.90381,0.83843 15.90381,15.90382"
      id="path5104"
      inkscape:connector-curvature="0" />
-  <g
-     id="g5631"
-     transform="translate(-27.905601,-5.4032307)">
-    <rect
-       y="211.84996"
-       x="118.4056"
-       height="18.05327"
-       width="21.481739"
-       id="rect2987-4-0-0"
-       style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0" />
-    <text
-       inkscape:transform-center-x="2.6044813"
-       transform="scale(0.9999979,1.0000021)"
-       sodipodi:linespacing="125%"
-       id="text5217-8-9-2"
-       y="225.24431"
-       x="121.1868"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
-       xml:space="preserve"><tspan
-         id="tspan6156-7-4"
-         sodipodi:role="line"
-         x="121.1868"
-         y="225.24431">14</tspan></text>
-  </g>
   <text
      xml:space="preserve"
-     style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
-     x="108.67482"
-     y="206.41029"
-     id="text4119"
-     sodipodi:linespacing="125%"><tspan
-       sodipodi:role="line"
-       id="tspan4121"
-       x="108.67482"
-       y="206.41029"
-       style="font-size:8px;font-weight:bold;-inkscape-font-specification:Sans Bold">T</tspan></text>
-  <path
-     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3230)"
-     d="m 79.976346,193.5 12.52908,12.94673"
-     id="path5636"
-     inkscape:connector-type="polyline"
-     inkscape:connector-curvature="0"
-     inkscape:connection-start="#g5560"
-     inkscape:connection-start-point="d4"
-     inkscape:connection-end="#g5631"
-     inkscape:connection-end-point="d4" />
-  <text
-     xml:space="preserve"
-     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
-     x="143.52129"
-     y="224.8358"
-     id="text4787"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       x="143.52129"
-       y="224.8358"
-       id="tspan4791">temporary</tspan><tspan
-       sodipodi:role="line"
-       x="143.52129"
-       y="234.8358"
-       id="tspan4795">amend</tspan><tspan
-       sodipodi:role="line"
-       x="143.52129"
-       y="244.8358"
-       id="tspan4797">commit;</tspan><tspan
-       sodipodi:role="line"
-       x="143.52129"
-       y="254.8358"
-       id="tspan6283">obsolete and</tspan><tspan
-       sodipodi:role="line"
-       x="143.52129"
-       y="264.83582"
-       id="tspan6285">hidden</tspan></text>
-  <text
-     xml:space="preserve"
-     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      x="95.495201"
      y="291.81802"
-     id="text4799-8-7"
-     sodipodi:linespacing="125%"><tspan
+     id="text4799-8-7"><tspan
        sodipodi:role="line"
        id="tspan4801-4-8"
        x="95.495201"
-       y="291.81802">working dir</tspan></text>
+       y="291.81802"
+       style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">working dir</tspan></text>
   <path
      style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker3230);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
      d="M 114.6749,14.053603 C 108.77815,29.370318 80.769041,12.646358 73.241271,33.724116"
@@ -843,9 +774,4 @@
      d="m 92.984542,288.7868 c -17.463809,1.31107 -20.109707,1.30681 -21.213204,-14.14214"
      id="path7860"
      inkscape:connector-curvature="0" />
-  <path
-     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#marker3230)"
-     d="m 139.5,223.5 c -16.33548,3.61997 -8.82833,-10 -24.5,-10"
-     id="path8482"
-     inkscape:connector-curvature="0" />
 </svg>
--- a/docs/figures/figure-ug07.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug07.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -13,7 +13,7 @@
    height="220"
    id="svg8082"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug07.svg">
   <defs
      id="defs8084">
@@ -199,10 +199,10 @@
      inkscape:current-layer="layer1"
      inkscape:document-units="px"
      showgrid="false"
-     inkscape:window-width="887"
-     inkscape:window-height="875"
-     inkscape:window-x="342"
-     inkscape:window-y="160"
+     inkscape:window-width="1814"
+     inkscape:window-height="950"
+     inkscape:window-x="51"
+     inkscape:window-y="82"
      inkscape:window-maximized="0"
      fit-margin-top="0"
      fit-margin-left="0"
@@ -227,16 +227,16 @@
      transform="translate(0,18.65699)">
     <text
        xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="113.19138"
        y="21.624107"
        id="text5217-8-0"
-       sodipodi:linespacing="125%"
        transform="scale(0.9999979,1.0000021)"><tspan
          sodipodi:role="line"
          id="tspan8594"
          x="113.19138"
-         y="21.624107">hg evolve --all</tspan></text>
+         y="21.624107"
+         style="font-size:12px;line-height:1.25;font-family:monospace">hg evolve --all</tspan></text>
     <g
        id="g6372"
        transform="translate(63.844068,-32.28608)">
@@ -272,13 +272,12 @@
          style="fill:none;stroke:#000000;stroke-width:1.0000037;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(1.0000037,0.9999963)"
-         sodipodi:linespacing="125%"
          id="text5217-7"
          y="154.84212"
          x="3.3424876"
-         style="font-size:12.00004482px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
-           style="stroke:none"
+           style="font-size:12.00004482px;line-height:1.25;font-family:sans-serif;stroke:none"
            y="154.84212"
            x="3.3424876"
            id="tspan5219-3"
@@ -293,18 +292,18 @@
        y="136.78973" />
     <text
        xml:space="preserve"
-       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="63.342571"
        y="150.18422"
        id="text5217-8-7"
-       sodipodi:linespacing="125%"
        transform="scale(0.9999979,1.0000021)"><tspan
          sodipodi:role="line"
          id="tspan3914"
          x="63.342571"
-         y="150.18422">15</tspan></text>
+         y="150.18422"
+         style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">14</tspan></text>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6)"
        d="M 18.241201,77.474272 64.240665,136.78973"
        id="path5012"
        inkscape:connector-type="polyline"
@@ -314,7 +313,7 @@
        inkscape:connection-start="#g3291"
        inkscape:connection-start-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448)"
        d="M 21.981991,68.626653 60.499999,69.26862"
        id="path4542"
        inkscape:connector-type="polyline"
@@ -332,16 +331,16 @@
          id="rect2987-4-8"
          style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8-4"
          y="154.84152"
          x="63.497734"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-4"
            sodipodi:role="line"
            x="63.497734"
-           y="154.84152">11</tspan></text>
+           y="154.84152"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">11</tspan></text>
     </g>
     <g
        id="g8702"
@@ -355,16 +354,16 @@
          style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-72-7"
          y="88.815628"
          x="123.54466"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-9-7"
            sodipodi:role="line"
            x="123.54466"
-           y="88.815628">12</tspan></text>
+           y="88.815628"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">12</tspan></text>
     </g>
     <g
        id="g8707"
@@ -378,19 +377,19 @@
          style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-3-9"
          y="88.815628"
          x="183.42468"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-0-0"
            sodipodi:role="line"
            x="183.42468"
-           y="88.815628">13</tspan></text>
+           y="88.815628"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">13</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 81.981809,68.44765 38.517981,-2e-6"
        id="path3178-0"
        inkscape:connector-type="polyline"
@@ -398,8 +397,8 @@
        inkscape:connection-end="#g8702"
        inkscape:connection-end-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
-       d="m 141.98153,68.447648 38.51827,0"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+       d="M 141.98153,68.447648 H 180.4998"
        id="path3180-2"
        inkscape:connector-type="polyline"
        inkscape:connector-curvature="0"
@@ -408,71 +407,28 @@
        inkscape:connection-end="#g8707"
        inkscape:connection-end-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
        d="m 71.240899,77.47427 -2.6e-5,59.31546"
        id="path4123"
        inkscape:connector-type="polyline"
        inkscape:connector-curvature="0"
        inkscape:connection-end="#rect2987-4-4"
        inkscape:connection-end-point="d4" />
-    <g
-       id="g5631"
-       transform="translate(-27.905602,-122.06022)">
-      <rect
-         y="211.84996"
-         x="118.4056"
-         height="18.05327"
-         width="21.481739"
-         id="rect2987-4-0-0"
-         style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0" />
-      <text
-         inkscape:transform-center-x="2.6044813"
-         transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
-         id="text5217-8-9-2"
-         y="225.24431"
-         x="121.1868"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
-         xml:space="preserve"><tspan
-           id="tspan6156-7-4"
-           sodipodi:role="line"
-           x="121.1868"
-           y="225.24431">14</tspan></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
-       x="108.67482"
-       y="89.753288"
-       id="text4119"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan4121"
-         x="108.67482"
-         y="89.753288"
-         style="font-size:8px;font-weight:bold;-inkscape-font-specification:Sans Bold">T</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3230)"
-       d="M 80.157925,77.47427 92.323846,89.78974"
-       id="path5636"
-       inkscape:connector-type="polyline"
-       inkscape:connector-curvature="0"
-       inkscape:connection-start="#g5560"
-       inkscape:connection-start-point="d4"
-       inkscape:connection-end="#g5631"
-       inkscape:connection-end-point="d4" />
     <flowRoot
        xml:space="preserve"
        id="flowRoot8394"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        transform="translate(0,-36)"><flowRegion
-         id="flowRegion8396"><rect
+         id="flowRegion8396"
+         style="font-family:sans-serif"><rect
            id="rect8398"
            width="311.2373"
            height="172.50397"
            x="13.690791"
-           y="268.24911" /></flowRegion><flowPara
-         id="flowPara8400" /></flowRoot>    <g
+           y="268.24911"
+           style="font-family:sans-serif" /></flowRegion><flowPara
+         id="flowPara8400"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif"> </flowPara></flowRoot>    <g
        id="g8798"
        transform="translate(28.427001,-38.337945)">
       <rect
@@ -484,16 +440,16 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-7-4"
          y="188.52202"
          x="94.915642"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            y="188.52202"
            x="94.915642"
            id="tspan3914-6"
-           sodipodi:role="line">16</tspan></text>
+           sodipodi:role="line"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">15</tspan></text>
     </g>
     <g
        id="g8803"
@@ -507,19 +463,19 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-7-46"
          y="188.52202"
          x="174.91582"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            y="188.52202"
            x="174.91582"
            id="tspan3914-1"
-           sodipodi:role="line">17</tspan></text>
+           sodipodi:role="line"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">16</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448)"
        d="m 81.981739,145.81637 38.518261,0"
        id="path4542-5"
        inkscape:connector-type="polyline"
@@ -529,7 +485,7 @@
        inkscape:connection-end="#g8798"
        inkscape:connection-end-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448)"
        d="M 141.98174,145.77795 180.5,145.64016"
        id="path4542-1"
        inkscape:connector-type="polyline"
@@ -537,7 +493,7 @@
        inkscape:connection-start="#g8798"
        inkscape:connection-start-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
        d="m 131.24068,77.474283 1.6e-4,59.315457"
        id="path4123-1"
        inkscape:connector-type="polyline"
@@ -547,7 +503,7 @@
        inkscape:connection-end="#g8798"
        inkscape:connection-end-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
        d="m 191.24069,77.474283 1.6e-4,59.315457"
        id="path4123-14"
        inkscape:connector-type="polyline"
@@ -558,37 +514,37 @@
        inkscape:connection-end-point="d4" />
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="226.23938"
        y="81.810745"
-       id="text3058"
-       sodipodi:linespacing="125%"><tspan
+       id="text3058"><tspan
          sodipodi:role="line"
          id="tspan3060"
          x="226.23938"
-         y="81.810745">obsolete, hidden</tspan></text>
+         y="81.810745"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">obsolete, hidden</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="243.1927"
        y="151.52931"
-       id="text6402"
-       sodipodi:linespacing="125%"><tspan
+       id="text6402"><tspan
          sodipodi:role="line"
          id="tspan6404"
          x="243.1927"
-         y="151.52931">working dir</tspan></text>
+         y="151.52931"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">working dir</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="102"
        y="184.34302"
-       id="text7020"
-       sodipodi:linespacing="125%"><tspan
+       id="text7020"><tspan
          sodipodi:role="line"
          id="tspan7022"
          x="102"
-         y="184.34302">successors</tspan></text>
+         y="184.34302"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">successors</tspan></text>
     <path
        style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
        d="m 214.5,51.843009 c 2.26039,0.588947 4.4416,0.9416 5.5,2 2.95364,2.953636 2.98797,53.512031 0.5,56.000001 -3.15839,3.15839 -5.49327,6.33109 -9,7.5"
--- a/docs/figures/figure-ug08.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug08.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -13,7 +13,7 @@
    height="190"
    id="svg8392"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug08.svg">
   <defs
      id="defs8394">
@@ -132,7 +132,7 @@
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
+        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
@@ -152,16 +152,16 @@
          id="rect2987-4"
          style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8"
          y="807.20361"
          x="3.4977415"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156"
            sodipodi:role="line"
            x="3.4977415"
-           y="807.20361">18</tspan></text>
+           y="807.20361"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">18</tspan></text>
     </g>
     <g
        id="g3118"
@@ -175,16 +175,16 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-72"
          y="14.841505"
          x="123.54487"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-9"
            sodipodi:role="line"
            x="123.54487"
-           y="14.841505">19</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">19</tspan></text>
     </g>
     <g
        id="g3126"
@@ -198,19 +198,19 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-3"
          y="14.841505"
          x="183.42488"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-0"
            sodipodi:role="line"
            x="183.42488"
-           y="14.841505">20</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">20</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 21.981806,796.83549 38.518193,4e-5"
        id="path3178"
        inkscape:connector-type="polyline"
@@ -220,8 +220,8 @@
        inkscape:connection-start="#g8678"
        inkscape:connection-start-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
-       d="m 81.981738,796.83555 38.518072,0"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+       d="M 81.981738,796.83555 H 120.49981"
        id="path3180"
        inkscape:connector-type="polyline"
        inkscape:connector-curvature="0"
@@ -231,27 +231,27 @@
        inkscape:connection-end-point="d4" />
     <text
        xml:space="preserve"
-       style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="192.95625"
        y="783.27075"
-       id="text4799-8"
-       sodipodi:linespacing="125%"><tspan
+       id="text4799-8"><tspan
          sodipodi:role="line"
          id="tspan4801-4"
          x="192.95625"
-         y="783.27075">working dir</tspan></text>
+         y="783.27075"
+         style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">working dir</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="80.662636"
        y="851.4538"
        id="text5217-8-0"
-       sodipodi:linespacing="125%"
        transform="scale(0.9999979,1.0000021)"><tspan
          sodipodi:role="line"
          id="tspan8594"
          x="80.662636"
-         y="851.4538">hg prune 19</tspan></text>
+         y="851.4538"
+         style="font-size:12px;line-height:1.25;font-family:monospace">hg prune 19</tspan></text>
     <g
        id="g6372"
        transform="translate(31.315375,797.54535)">
@@ -286,16 +286,16 @@
          id="rect2987-4-9"
          style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8-32"
          y="807.20361"
          x="3.4977415"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-8"
            sodipodi:role="line"
            x="3.4977415"
-           y="807.20361">18</tspan></text>
+           y="807.20361"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">18</tspan></text>
     </g>
     <rect
        style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999785;stroke-dashoffset:0"
@@ -306,15 +306,15 @@
        y="892.8089" />
     <text
        xml:space="preserve"
-       style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="63.544647"
        y="906.20331"
-       id="text5217-8-72-1"
-       sodipodi:linespacing="125%"><tspan
+       id="text5217-8-72-1"><tspan
          y="906.20331"
          x="63.544647"
          sodipodi:role="line"
-         id="tspan6156-9-8">19</tspan></text>
+         id="tspan6156-9-8"
+         style="font-size:11.99999428px;line-height:1.25;font-family:sans-serif">19</tspan></text>
     <g
        id="g3126-8"
        transform="matrix(1.0000032,0,0,0.99999991,-60.000385,891.36218)">
@@ -327,19 +327,19 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-3-8"
          y="14.841505"
          x="183.42488"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-0-9"
            sodipodi:role="line"
            x="183.42488"
-           y="14.841505">20</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">20</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 21.981875,901.83548 38.518126,5e-5"
        id="path3178-9"
        inkscape:connector-type="polyline"
@@ -347,7 +347,7 @@
        inkscape:connection-start="#g8678-6"
        inkscape:connection-start-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 81.981808,901.83554 38.518382,0"
        id="path3180-1"
        inkscape:connector-type="polyline"
@@ -356,41 +356,42 @@
        inkscape:connection-end-point="d4" />
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="33.872818"
        y="941.35645"
-       id="text9295"
-       sodipodi:linespacing="125%"><tspan
+       id="text9295"><tspan
          sodipodi:role="line"
          id="tspan9297"
          x="33.872818"
-         y="941.35645">obsolete</tspan><tspan
+         y="941.35645"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">obsolete</tspan><tspan
          sodipodi:role="line"
          x="33.872818"
          y="953.85645"
-         id="tspan9299">but visible</tspan></text>
+         id="tspan9299"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">but visible</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="125.75282"
        y="939.66284"
-       id="text9301"
-       sodipodi:linespacing="125%"><tspan
+       id="text9301"><tspan
          sodipodi:role="line"
          id="tspan9303"
          x="125.75282"
-         y="939.66284">unstable</tspan></text>
+         y="939.66284"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">orphan</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="192.95625"
        y="920.7381"
-       id="text4799-8-4"
-       sodipodi:linespacing="125%"><tspan
+       id="text4799-8-4"><tspan
          sodipodi:role="line"
          id="tspan4801-4-2"
          x="192.95625"
-         y="920.7381">working dir</tspan></text>
+         y="920.7381"
+         style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">working dir</tspan></text>
     <path
        style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker8695);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
        d="m 188.0904,779.78292 c -26.25288,3.51598 -8.22083,22.5684 -39.59798,18.38478"
--- a/docs/figures/figure-ug09.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug09.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -13,7 +13,7 @@
    height="150"
    id="svg10360"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug09.svg">
   <defs
      id="defs10362">
@@ -90,7 +90,7 @@
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
+        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
@@ -101,16 +101,16 @@
      transform="translate(-52.986766,123.22995)">
     <text
        xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="132.17838"
        y="-88.939552"
        id="text5217-8-0"
-       sodipodi:linespacing="125%"
        transform="scale(0.9999979,1.0000021)"><tspan
          sodipodi:role="line"
          id="tspan8594"
          x="132.17838"
-         y="-88.939552">hg evolve --all</tspan></text>
+         y="-88.939552"
+         style="font-size:12px;line-height:1.25;font-family:monospace">hg evolve --all</tspan></text>
     <g
        id="g6372"
        transform="translate(82.830913,-142.84994)">
@@ -145,16 +145,16 @@
          id="rect2987-4-9"
          style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8-32"
          y="807.20361"
          x="3.4977415"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-8"
            sodipodi:role="line"
            x="3.4977415"
-           y="807.20361">18</tspan></text>
+           y="807.20361"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">18</tspan></text>
     </g>
     <g
        id="g11168"
@@ -167,16 +167,16 @@
          id="rect2987-4-02-6"
          style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999783;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8-72-1"
          y="-149.15291"
          x="116.53148"
-         style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-9-8"
            sodipodi:role="line"
            x="116.53148"
-           y="-149.15291">19</tspan></text>
+           y="-149.15291"
+           style="font-size:11.99999428px;line-height:1.25;font-family:sans-serif">19</tspan></text>
     </g>
     <g
        id="g11163"
@@ -189,19 +189,19 @@
          id="rect2987-4-026-7"
          style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8-3-8"
          y="-149.15244"
          x="176.41162"
-         style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-0-9"
            sodipodi:role="line"
            x="176.41162"
-           y="-149.15244">20</tspan></text>
+           y="-149.15244"
+           style="font-size:11.99999428px;line-height:1.25;font-family:sans-serif">20</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 74.96872,-41.52073 38.51813,3.7e-5"
        id="path3178-9"
        inkscape:connector-type="polyline"
@@ -211,7 +211,7 @@
        inkscape:connection-start="#g8678-6"
        inkscape:connection-start-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 134.96865,-41.520681 38.5184,1e-5"
        id="path3180-1"
        inkscape:connector-type="polyline"
@@ -231,16 +231,16 @@
          id="rect2987-4-9-5"
          style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8-32-6"
          y="807.20361"
          x="3.4977415"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-8-9"
            sodipodi:role="line"
            x="3.4977415"
-           y="807.20361">21</tspan></text>
+           y="807.20361"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">21</tspan></text>
     </g>
     <path
        style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker10584)"
@@ -253,7 +253,7 @@
        inkscape:connection-end="#g8678-6-4"
        inkscape:connection-end-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
        d="m 184.22792,-32.494034 -1.1e-4,31.0082104"
        id="path4123-2"
        inkscape:connector-type="polyline"
@@ -264,30 +264,31 @@
        inkscape:connection-end-point="d4" />
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="188.27898"
        y="-68.730186"
-       id="text11674"
-       sodipodi:linespacing="125%"><tspan
+       id="text11674"><tspan
          sodipodi:role="line"
          id="tspan11676"
          x="188.27898"
-         y="-68.730186">obsolete, hidden</tspan></text>
+         y="-68.730186"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">obsolete, hidden</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="229.09592"
        y="4.1899796"
-       id="text11678"
-       sodipodi:linespacing="125%"><tspan
+       id="text11678"><tspan
          sodipodi:role="line"
          id="tspan11680"
          x="229.09592"
-         y="4.1899796">successor,</tspan><tspan
+         y="4.1899796"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">successor,</tspan><tspan
          sodipodi:role="line"
          x="229.09592"
          y="16.68998"
-         id="tspan11682">working dir</tspan></text>
+         id="tspan11682"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">working dir</tspan></text>
     <path
        style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker10584);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
        d="m 224.96835,6.48307 c -14.81489,-0.42162 -8.84647,9.26545 -25.22395,4.58617"
--- a/docs/figures/figure-ug10.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug10.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -13,7 +13,7 @@
    height="400"
    id="svg8392"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug10.svg">
   <defs
      id="defs8394">
@@ -264,16 +264,16 @@
          id="rect2987-4"
          style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8"
          y="807.20361"
          x="3.4977415"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156"
            sodipodi:role="line"
            x="3.4977415"
-           y="807.20361">21</tspan></text>
+           y="807.20361"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">21</tspan></text>
     </g>
     <g
        id="g3118"
@@ -287,16 +287,16 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-72"
          y="14.841505"
          x="123.54487"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-9"
            sodipodi:role="line"
            x="123.54487"
-           y="14.841505">22</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">22</tspan></text>
     </g>
     <g
        id="g3126"
@@ -310,19 +310,19 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-3"
          y="14.841505"
          x="183.42488"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-0"
            sodipodi:role="line"
            x="183.42488"
-           y="14.841505">23</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">23</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 21.981806,588.83549 38.518193,4e-5"
        id="path3178"
        inkscape:connector-type="polyline"
@@ -332,8 +332,8 @@
        inkscape:connection-start="#g8678"
        inkscape:connection-start-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
-       d="m 81.981738,588.83555 38.518072,0"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+       d="M 81.981738,588.83555 H 120.49981"
        id="path3180"
        inkscape:connector-type="polyline"
        inkscape:connector-curvature="0"
@@ -352,16 +352,16 @@
          id="rect2987-4-9"
          style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8-32"
          y="807.20361"
          x="3.4977415"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-8"
            sodipodi:role="line"
            x="3.4977415"
-           y="807.20361">21</tspan></text>
+           y="807.20361"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">21</tspan></text>
     </g>
     <rect
        style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999785;stroke-dashoffset:0"
@@ -372,15 +372,15 @@
        y="684.8089" />
     <text
        xml:space="preserve"
-       style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="63.544647"
        y="698.20331"
-       id="text5217-8-72-1"
-       sodipodi:linespacing="125%"><tspan
+       id="text5217-8-72-1"><tspan
          y="698.20331"
          x="63.544647"
          sodipodi:role="line"
-         id="tspan6156-9-8">22</tspan></text>
+         id="tspan6156-9-8"
+         style="font-size:11.99999428px;line-height:1.25;font-family:sans-serif">22</tspan></text>
     <g
        id="g3126-8"
        transform="matrix(1.0000032,0,0,0.99999991,-60.000385,683.36218)">
@@ -393,19 +393,19 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-3-8"
          y="14.841505"
          x="183.42488"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-0-9"
            sodipodi:role="line"
            x="183.42488"
-           y="14.841505">23</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">23</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 21.981875,693.83548 38.518126,5e-5"
        id="path3178-9"
        inkscape:connector-type="polyline"
@@ -413,7 +413,7 @@
        inkscape:connection-start="#g8678-6"
        inkscape:connection-start-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 81.981808,693.83554 38.518382,0"
        id="path3180-1"
        inkscape:connector-type="polyline"
@@ -422,47 +422,48 @@
        inkscape:connection-end-point="d4" />
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="7.5114212"
        y="652.66315"
-       id="text9295"
-       sodipodi:linespacing="100%"><tspan
+       id="text9295"><tspan
          sodipodi:role="line"
          id="tspan9297"
          x="7.5114212"
-         y="652.66315">obsolete</tspan><tspan
+         y="652.66315"
+         style="font-size:10px;line-height:1;font-family:sans-serif">obsolete</tspan><tspan
          sodipodi:role="line"
          x="7.5114212"
          y="662.66315"
-         id="tspan9299">but visible</tspan></text>
+         id="tspan9299"
+         style="font-size:10px;line-height:1;font-family:sans-serif">but visible</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="155.24913"
        y="668.43335"
-       id="text9301"
-       sodipodi:linespacing="125%"><tspan
+       id="text9301"><tspan
          sodipodi:role="line"
          id="tspan9303"
          x="155.24913"
-         y="668.43335">unstable</tspan></text>
+         y="668.43335"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">orphan</tspan></text>
     <g
        id="g5433"
        transform="translate(32.476727,584.47248)">
       <text
          transform="scale(0.9999978,1.0000022)"
-         sodipodi:linespacing="125%"
          id="text5217-8-0"
          y="58.841717"
          x="46.92271"
-         style="font-size:11.99999809px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            y="58.841717"
            x="46.92271"
            id="tspan8594"
-           sodipodi:role="line">hg uncommit <tspan
+           sodipodi:role="line"
+           style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg uncommit <tspan
    id="tspan3131"
-   style="font-style:italic">f1 f2 ...</tspan></tspan></text>
+   style="font-style:italic;font-family:monospace">f1 f2 ...</tspan></tspan></text>
       <g
          transform="translate(-0.59241834,4.9316169)"
          id="g6372-4">
@@ -499,38 +500,40 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-72-3"
          y="14.841505"
          x="123.54487"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-9-3"
            sodipodi:role="line"
            x="123.54487"
-           y="14.841505">24</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">24</tspan></text>
     </g>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="187.68906"
        y="740.26349"
-       id="text3218"
-       sodipodi:linespacing="100%"><tspan
+       id="text3218"><tspan
          sodipodi:role="line"
          id="tspan3220"
          x="187.68906"
-         y="740.26349">working dir</tspan><tspan
+         y="740.26349"
+         style="font-size:10px;line-height:1;font-family:sans-serif">working dir</tspan><tspan
          sodipodi:role="line"
          x="187.68906"
          y="750.26349"
-         id="tspan4379">(with uncommitted</tspan><tspan
+         id="tspan4379"
+         style="font-size:10px;line-height:1;font-family:sans-serif">(with uncommitted</tspan><tspan
          sodipodi:role="line"
          x="187.68906"
          y="760.26349"
-         id="tspan4381">changes to f1 f2 ...)</tspan></text>
+         id="tspan4381"
+         style="font-size:10px;line-height:1;font-family:sans-serif">changes to f1 f2 ...)</tspan></text>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 21.981875,702.7739 38.518124,32.05414"
        id="path3178-9-5"
        inkscape:connector-type="polyline"
@@ -540,7 +543,7 @@
        inkscape:connection-end="#g3118-2"
        inkscape:connection-end-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
        d="m 71.240897,702.86217 -2.2e-5,31.87761"
        id="path4123"
        inkscape:connector-type="polyline"
@@ -551,22 +554,23 @@
        inkscape:connection-end-point="d4" />
     <text
        xml:space="preserve"
-       style="font-size:11.99999809px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="79.694885"
        y="791.03015"
        id="text5217-8-0-7"
-       sodipodi:linespacing="125%"
        transform="scale(0.9999978,1.0000022)"><tspan
          id="tspan3316"
          sodipodi:role="line"
          x="79.694885"
-         y="791.03015">hg revert <tspan
+         y="791.03015"
+         style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg revert <tspan
    id="tspan3314"
-   style="font-style:italic">f1 f2 ...</tspan></tspan><tspan
+   style="font-style:italic;font-family:monospace">f1 f2 ...</tspan></tspan><tspan
          id="tspan3322"
          sodipodi:role="line"
          x="79.694885"
-         y="806.03015">hg evolve --all</tspan></text>
+         y="806.03015"
+         style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg evolve --all</tspan></text>
     <g
        id="g6372-4-2"
        transform="translate(32.179684,745.12164)">
@@ -602,15 +606,15 @@
          y="793.80884" />
       <text
          xml:space="preserve"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="3.4977415"
          y="807.20361"
-         id="text5217-8-32-6"
-         sodipodi:linespacing="125%"><tspan
+         id="text5217-8-32-6"><tspan
            y="807.20361"
            x="3.4977415"
            sodipodi:role="line"
-           id="tspan6156-8-5">21</tspan></text>
+           id="tspan6156-8-5"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">21</tspan></text>
     </g>
     <rect
        y="839.21106"
@@ -620,16 +624,16 @@
        id="rect2987-4-02-6-9"
        style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999785;stroke-dashoffset:0" />
     <text
-       sodipodi:linespacing="125%"
        id="text5217-8-72-1-2"
        y="852.60547"
        x="63.544647"
-       style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          id="tspan6156-9-8-1"
          sodipodi:role="line"
          x="63.544647"
-         y="852.60547">22</tspan></text>
+         y="852.60547"
+         style="font-size:11.99999428px;line-height:1.25;font-family:sans-serif">22</tspan></text>
     <g
        id="g4295">
       <rect
@@ -641,15 +645,15 @@
          y="839.21106" />
       <text
          xml:space="preserve"
-         style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="123.42475"
          y="852.60547"
-         id="text5217-8-3-8-6"
-         sodipodi:linespacing="125%"><tspan
+         id="text5217-8-3-8-6"><tspan
            y="852.60547"
            x="123.42475"
            sodipodi:role="line"
-           id="tspan6156-0-9-3">23</tspan></text>
+           id="tspan6156-0-9-3"
+           style="font-size:11.99999428px;line-height:1.25;font-family:sans-serif">23</tspan></text>
     </g>
     <path
        inkscape:connection-start-point="d4"
@@ -658,13 +662,13 @@
        inkscape:connector-type="polyline"
        id="path3178-9-1"
        d="m 21.981875,848.23763 38.518124,2e-5"
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline" />
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)" />
     <path
        inkscape:connector-curvature="0"
        inkscape:connector-type="polyline"
        id="path3180-1-7"
        d="m 81.981809,848.23766 38.518381,3e-5"
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        inkscape:connection-end="#g4295"
        inkscape:connection-end-point="d4" />
     <g
@@ -679,16 +683,16 @@
          y="1.4467307" />
       <text
          xml:space="preserve"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="123.54487"
          y="14.841505"
          id="text5217-8-72-3-4"
-         sodipodi:linespacing="125%"
          transform="scale(0.9999979,1.0000021)"><tspan
            y="14.841505"
            x="123.54487"
            sodipodi:role="line"
-           id="tspan6156-9-3-9">24</tspan></text>
+           id="tspan6156-9-3-9"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">24</tspan></text>
     </g>
     <path
        inkscape:connection-end-point="d4"
@@ -699,7 +703,7 @@
        inkscape:connector-type="polyline"
        id="path3178-9-5-1"
        d="m 21.981875,857.17605 38.518124,32.05412"
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline" />
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)" />
     <path
        inkscape:connection-end-point="d4"
        inkscape:connection-end="#g3118-2-6"
@@ -709,7 +713,7 @@
        inkscape:connector-type="polyline"
        id="path4123-8"
        d="m 71.240897,857.26433 -2.2e-5,31.87757"
-       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline" />
+       style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)" />
     <g
        transform="translate(-1.0430814e-6,887.87361)"
        id="g3118-2-6-6">
@@ -722,23 +726,23 @@
          y="1.4467307" />
       <text
          xml:space="preserve"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          x="123.54487"
          y="14.841505"
          id="text5217-8-72-3-4-9"
-         sodipodi:linespacing="125%"
          transform="scale(0.9999979,1.0000021)"><tspan
            y="14.841505"
            x="123.54487"
            sodipodi:role="line"
-           id="tspan6156-9-3-9-1">25</tspan></text>
+           id="tspan6156-9-3-9-1"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">25</tspan></text>
     </g>
     <path
        inkscape:connector-curvature="0"
        inkscape:connector-type="polyline"
        id="path4123-8-2"
        d="m 131.24105,857.26433 -1.4e-4,32.05601"
-       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
        inkscape:connection-start="#g4295"
        inkscape:connection-start-point="d4"
        inkscape:connection-end="#g3118-2-6-6"
@@ -748,72 +752,76 @@
        inkscape:connector-type="polyline"
        id="path3178-9-1-1"
        d="M 81.981738,898.20048 120.5,898.31503"
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        inkscape:connection-start="#g3118-2-6"
        inkscape:connection-start-point="d4"
        inkscape:connection-end="#g3118-2-6-6"
        inkscape:connection-end-point="d4" />
     <text
        xml:space="preserve"
-       style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="187.37656"
        y="909.57391"
-       id="text4799-8-0"
-       sodipodi:linespacing="125%"><tspan
+       id="text4799-8-0"><tspan
          sodipodi:role="line"
          x="187.37656"
          y="909.57391"
-         id="tspan4416">working dir</tspan><tspan
+         id="tspan4416"
+         style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">working dir</tspan><tspan
          sodipodi:role="line"
          x="187.37656"
          y="922.07391"
-         id="tspan4420">(clean)</tspan></text>
+         id="tspan4420"
+         style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">(clean)</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="175.91385"
        y="840.83063"
-       id="text4404"
-       sodipodi:linespacing="100%"><tspan
+       id="text4404"><tspan
          sodipodi:role="line"
          id="tspan4406"
          x="175.91385"
-         y="840.83063">obsolete,</tspan><tspan
+         y="840.83063"
+         style="font-size:10px;line-height:1;font-family:sans-serif">obsolete,</tspan><tspan
          sodipodi:role="line"
          x="175.91385"
          y="850.83063"
-         id="tspan4408">hidden,</tspan><tspan
+         id="tspan4408"
+         style="font-size:10px;line-height:1;font-family:sans-serif">hidden,</tspan><tspan
          sodipodi:role="line"
          x="175.91385"
          y="860.83063"
-         id="tspan4410">precursors</tspan></text>
+         id="tspan4410"
+         style="font-size:10px;line-height:1;font-family:sans-serif">predecessors</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="53.690826"
        y="380.35703"
        id="text4412"
-       sodipodi:linespacing="100%"
        transform="translate(0,559.99805)"><tspan
          sodipodi:role="line"
          id="tspan4414"
          x="53.690826"
-         y="380.35703">successors</tspan></text>
+         y="380.35703"
+         style="font-size:10px;line-height:1;font-family:sans-serif">successors</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="187.37656"
        y="571.41107"
-       id="text4799-8-0-8"
-       sodipodi:linespacing="125%"><tspan
+       id="text4799-8-0-8"><tspan
          sodipodi:role="line"
          x="187.37656"
          y="571.41107"
-         id="tspan4416-9">working dir</tspan><tspan
+         id="tspan4416-9"
+         style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">working dir</tspan><tspan
          sodipodi:role="line"
          x="187.37656"
          y="583.91107"
-         id="tspan4420-1">(clean)</tspan></text>
+         id="tspan4420-1"
+         style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">(clean)</tspan></text>
     <path
        style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0)"
        d="M 182.62097,9.6751729 C 149.31312,5.6732792 109.12827,-5.7223311 84.489703,18.916234"
--- a/docs/figures/figure-ug11.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug11.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -13,7 +13,7 @@
    height="260"
    id="svg8392"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug11.svg">
   <defs
      id="defs8394">
@@ -306,16 +306,16 @@
          id="rect2987-4"
          style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8"
          y="807.20361"
          x="3.4977415"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156"
            sodipodi:role="line"
            x="3.4977415"
-           y="807.20361">25</tspan></text>
+           y="807.20361"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">25</tspan></text>
     </g>
     <g
        id="g3118"
@@ -329,16 +329,16 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-72"
          y="14.841505"
          x="123.54487"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-9"
            sodipodi:role="line"
            x="123.54487"
-           y="14.841505">26</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">26</tspan></text>
     </g>
     <g
        id="g3126"
@@ -352,19 +352,19 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-3"
          y="14.841505"
          x="183.42488"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-0"
            sodipodi:role="line"
            x="183.42488"
-           y="14.841505">27</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">27</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 21.981806,580.83549 38.518193,4e-5"
        id="path3178"
        inkscape:connector-type="polyline"
@@ -374,8 +374,8 @@
        inkscape:connection-start="#g8678"
        inkscape:connection-start-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
-       d="m 81.981738,580.83555 38.518072,0"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+       d="M 81.981738,580.83555 H 120.49981"
        id="path3180"
        inkscape:connector-type="polyline"
        inkscape:connector-curvature="0"
@@ -394,16 +394,16 @@
          id="rect2987-4-9"
          style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8-32"
          y="807.20361"
          x="3.4977415"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-8"
            sodipodi:role="line"
            x="3.4977415"
-           y="807.20361">25</tspan></text>
+           y="807.20361"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">25</tspan></text>
     </g>
     <rect
        style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999785;stroke-dashoffset:0"
@@ -414,15 +414,15 @@
        y="685.14484" />
     <text
        xml:space="preserve"
-       style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="63.544647"
        y="698.53925"
-       id="text5217-8-72-1"
-       sodipodi:linespacing="125%"><tspan
+       id="text5217-8-72-1"><tspan
          y="698.53925"
          x="63.544647"
          sodipodi:role="line"
-         id="tspan6156-9-8">26</tspan></text>
+         id="tspan6156-9-8"
+         style="font-size:11.99999428px;line-height:1.25;font-family:sans-serif">26</tspan></text>
     <g
        id="g3126-8"
        transform="matrix(1.0000032,0,0,0.99999991,-60.000385,683.69805)">
@@ -435,19 +435,19 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-3-8"
          y="14.841505"
          x="183.42488"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-0-9"
            sodipodi:role="line"
            x="183.42488"
-           y="14.841505">27</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">27</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 21.981875,694.17135 38.518126,5e-5"
        id="path3178-9"
        inkscape:connector-type="polyline"
@@ -455,7 +455,7 @@
        inkscape:connection-start="#g8678-6"
        inkscape:connection-start-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 81.981808,694.17141 38.518382,0"
        id="path3180-1"
        inkscape:connector-type="polyline"
@@ -464,48 +464,50 @@
        inkscape:connection-end-point="d4" />
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="6.5114212"
        y="652.66315"
-       id="text9295"
-       sodipodi:linespacing="100%"><tspan
+       id="text9295"><tspan
          sodipodi:role="line"
          id="tspan9297"
          x="6.5114212"
-         y="652.66315">obsolete</tspan><tspan
+         y="652.66315"
+         style="font-size:10px;line-height:1;font-family:sans-serif">obsolete</tspan><tspan
          sodipodi:role="line"
          x="6.5114212"
          y="662.66315"
-         id="tspan9299">but visible</tspan></text>
+         id="tspan9299"
+         style="font-size:10px;line-height:1;font-family:sans-serif">but visible</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="159.24913"
        y="668.43335"
-       id="text9301"
-       sodipodi:linespacing="125%"><tspan
+       id="text9301"><tspan
          sodipodi:role="line"
          id="tspan9303"
          x="159.24913"
-         y="668.43335">unstable</tspan></text>
+         y="668.43335"
+         style="font-size:10px;line-height:1.25;font-family:sans-serif">orphan</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:11.99999809px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="79.399506"
        y="627.31293"
        id="text5217-8-0"
-       sodipodi:linespacing="125%"
        transform="scale(0.9999978,1.0000022)"><tspan
          sodipodi:role="line"
          id="tspan8594"
          x="79.399506"
-         y="627.31293">hg uncommit <tspan
-   style="font-style:italic"
+         y="627.31293"
+         style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg uncommit <tspan
+   style="font-style:italic;font-family:monospace"
    id="tspan3131">f1 f2 ...</tspan></tspan><tspan
          sodipodi:role="line"
          x="79.399506"
          y="642.31293"
-         id="tspan3124">hg commit</tspan></text>
+         id="tspan3124"
+         style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg commit</tspan></text>
     <g
        id="g6372-4"
        transform="translate(31.884309,581.4041)">
@@ -541,34 +543,35 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-72-3"
          y="14.841505"
          x="123.54487"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-9-3"
            sodipodi:role="line"
            x="123.54487"
-           y="14.841505">28</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">28</tspan></text>
     </g>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="187.37656"
        y="781.10907"
-       id="text3218"
-       sodipodi:linespacing="100%"><tspan
+       id="text3218"><tspan
          sodipodi:role="line"
          x="187.37656"
          y="781.10907"
-         id="tspan4381">working dir</tspan><tspan
+         id="tspan4381"
+         style="font-size:10px;line-height:1;font-family:sans-serif">working dir</tspan><tspan
          sodipodi:role="line"
          x="187.37656"
          y="791.10907"
-         id="tspan3635">(clean)</tspan></text>
+         id="tspan3635"
+         style="font-size:10px;line-height:1;font-family:sans-serif">(clean)</tspan></text>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 21.981875,703.12214 38.518124,32.09853"
        id="path3178-9-5"
        inkscape:connector-type="polyline"
@@ -578,7 +581,7 @@
        inkscape:connection-end="#g3118-2"
        inkscape:connection-end-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
        d="m 71.240897,703.1981 -2.2e-5,31.94668"
        id="path4123"
        inkscape:connector-type="polyline"
@@ -589,19 +592,20 @@
        inkscape:connection-end-point="d4" />
     <text
        xml:space="preserve"
-       style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="187.37656"
        y="563.41107"
-       id="text4799-8-0-8"
-       sodipodi:linespacing="125%"><tspan
+       id="text4799-8-0-8"><tspan
          sodipodi:role="line"
          x="187.37656"
          y="563.41107"
-         id="tspan4416-9">working dir</tspan><tspan
+         id="tspan4416-9"
+         style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">working dir</tspan><tspan
          sodipodi:role="line"
          x="187.37656"
          y="575.91107"
-         id="tspan4420-1">(clean)</tspan></text>
+         id="tspan4420-1"
+         style="font-size:9.99999905px;line-height:1.25;font-family:sans-serif">(clean)</tspan></text>
     <path
        style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2-0);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
        d="m 182.62097,561.67322 c -33.30785,-4.00189 -73.4927,-15.3975 -98.131267,9.24106"
@@ -619,19 +623,19 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-72-3-7"
          y="14.841505"
          x="123.54487"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-9-3-0"
            sodipodi:role="line"
            x="123.54487"
-           y="14.841505">29</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">29</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="M 81.981738,753.12214 120.5,785.22069"
        id="path3180-1-6"
        inkscape:connector-type="polyline"
--- a/docs/figures/figure-ug12.svg	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/figures/figure-ug12.svg	Wed Jun 05 17:46:06 2019 +0200
@@ -13,7 +13,7 @@
    height="200"
    id="svg3183"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    sodipodi:docname="figure-ug12.svg">
   <defs
      id="defs3185">
@@ -324,16 +324,16 @@
        transform="translate(2,-8)">
       <text
          transform="scale(0.9999978,1.0000022)"
-         sodipodi:linespacing="125%"
          id="text5217-8-0-7"
          y="900.3703"
          x="76.696045"
-         style="font-size:11.99999809px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:monospace;-inkscape-font-specification:Monospace;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            y="900.3703"
            x="76.696045"
            sodipodi:role="line"
-           id="tspan3322">hg evolve --all</tspan></text>
+           id="tspan3322"
+           style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg evolve --all</tspan></text>
       <g
          transform="translate(29.180861,844.4619)"
          id="g6372-4-2">
@@ -369,16 +369,16 @@
          id="rect2987-4-9"
          style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8-32"
          y="807.20361"
          x="3.4977415"
-         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-8"
            sodipodi:role="line"
            x="3.4977415"
-           y="807.20361">25</tspan></text>
+           y="807.20361"
+           style="font-size:11.99999332px;line-height:1.25;font-family:sans-serif">25</tspan></text>
     </g>
     <rect
        style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999785;stroke-dashoffset:0"
@@ -389,15 +389,15 @@
        y="923.8089" />
     <text
        xml:space="preserve"
-       style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="63.544647"
        y="937.20331"
-       id="text5217-8-72-1"
-       sodipodi:linespacing="125%"><tspan
+       id="text5217-8-72-1"><tspan
          y="937.20331"
          x="63.544647"
          sodipodi:role="line"
-         id="tspan6156-9-8">26</tspan></text>
+         id="tspan6156-9-8"
+         style="font-size:11.99999428px;line-height:1.25;font-family:sans-serif">26</tspan></text>
     <g
        id="g4904">
       <rect
@@ -408,19 +408,19 @@
          id="rect2987-4-026-7"
          style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
       <text
-         sodipodi:linespacing="125%"
          id="text5217-8-3-8"
          y="937.20325"
          x="123.42475"
-         style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-0-9"
            sodipodi:role="line"
            x="123.42475"
-           y="937.20325">27</tspan></text>
+           y="937.20325"
+           style="font-size:11.99999428px;line-height:1.25;font-family:sans-serif">27</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 21.981875,932.83543 38.518126,5e-5"
        id="path3178-9"
        inkscape:connector-type="polyline"
@@ -428,7 +428,7 @@
        inkscape:connection-start="#g8678-6"
        inkscape:connection-start-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 81.981805,932.83549 38.518385,-1e-5"
        id="path3180-1"
        inkscape:connector-type="polyline"
@@ -447,34 +447,35 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-72-3"
          y="14.841505"
          x="123.54487"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-9-3"
            sodipodi:role="line"
            x="123.54487"
-           y="14.841505">28</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">28</tspan></text>
     </g>
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="188.87656"
        y="965.77319"
-       id="text3218"
-       sodipodi:linespacing="100%"><tspan
+       id="text3218"><tspan
          sodipodi:role="line"
          x="188.87656"
          y="965.77319"
-         id="tspan4381">working dir</tspan><tspan
+         id="tspan4381"
+         style="font-size:10px;line-height:1;font-family:sans-serif">working dir</tspan><tspan
          sodipodi:role="line"
          x="188.87656"
          y="975.77319"
-         id="tspan3635">(clean)</tspan></text>
+         id="tspan3635"
+         style="font-size:10px;line-height:1;font-family:sans-serif">(clean)</tspan></text>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 21.981875,941.78622 38.518124,32.09853"
        id="path3178-9-5"
        inkscape:connector-type="polyline"
@@ -484,7 +485,7 @@
        inkscape:connection-end="#g3118-2"
        inkscape:connection-end-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
        d="m 71.240897,941.86217 -2.2e-5,31.94669"
        id="path4123"
        inkscape:connector-type="polyline"
@@ -505,19 +506,19 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-72-3-7"
          y="14.841505"
          x="123.54487"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-9-3-0"
            sodipodi:role="line"
            x="123.54487"
-           y="14.841505">29</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">29</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="M 81.981738,991.78623 120.5,1023.8848"
        id="path3180-1-6"
        inkscape:connector-type="polyline"
@@ -538,19 +539,19 @@
          style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
       <text
          transform="scale(0.9999979,1.0000021)"
-         sodipodi:linespacing="125%"
          id="text5217-8-3-8-6"
          y="14.841505"
          x="183.42488"
-         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan6156-0-9-7"
            sodipodi:role="line"
            x="183.42488"
-           y="14.841505">30</tspan></text>
+           y="14.841505"
+           style="font-size:11.9999752px;line-height:1.25;font-family:sans-serif">30</tspan></text>
     </g>
     <path
-       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
        d="m 81.981738,982.8355 38.518272,4e-5"
        id="path3180-1-4"
        inkscape:connector-type="polyline"
@@ -560,7 +561,7 @@
        inkscape:connection-end="#g3126-8-4"
        inkscape:connection-end-point="d4" />
     <path
-       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#DotM)"
        d="m 131.24108,941.86211 -5e-5,31.9468"
        id="path4123-8"
        inkscape:connector-type="polyline"
@@ -576,20 +577,21 @@
        inkscape:connector-curvature="0" />
     <text
        xml:space="preserve"
-       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
        x="175"
        y="154.5"
        id="text5013"
-       sodipodi:linespacing="100%"
        transform="translate(0,852.36218)"><tspan
          sodipodi:role="line"
          id="tspan5015"
          x="175"
-         y="154.5">two heads!</tspan><tspan
+         y="154.5"
+         style="font-size:10px;line-height:1;font-family:sans-serif">two heads!</tspan><tspan
          sodipodi:role="line"
          x="175"
          y="164.5"
-         id="tspan5019">(merge or rebase)</tspan></text>
+         id="tspan5019"
+         style="font-size:10px;line-height:1;font-family:sans-serif">(merge or rebase)</tspan></text>
     <path
        style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2-0-5);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
        d="m 170,152.5 c -16.09308,-9.35441 4.39162,-25.49226 -23.5,-23.5"
--- a/docs/from-mq.rst	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/from-mq.rst	Wed Jun 05 17:46:06 2019 +0200
@@ -115,10 +115,10 @@
 ````````
 
 When you rewrite changesets, descendants of rewritten changesets are marked as
-"unstable". You need to rewrite them on top of the new version of their
+"orphan". You need to rewrite them on top of the new version of their
 ancestor.
 
-The evolution extension adds a command to rewrite "unstable"
+The evolution extension adds a command to rewrite "orphan"
 changesets:::
 
   $ hg evolve
--- a/docs/makefile	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/makefile	Wed Jun 05 17:46:06 2019 +0200
@@ -1,6 +1,7 @@
+SPHINXBUILD ?= sphinx-build
 
 all: tutorials/tutorial.rst tutorials/topic-tutorial.rst static/logo-evolve.ico
-	sphinx-build . ../html/
+	$(SPHINXBUILD) . ../html/
 
 tutorials/tutorial.rst: tutorials/tutorial.t test2rst.py
 	python test2rst.py tutorials/
@@ -10,5 +11,3 @@
 
 static/logo-evolve.ico: static/logo-evolve.svg
 	convert -resize 36x36 static/logo-evolve.svg static/logo-evolve.ico
-
-
--- a/docs/obs-terms.rst	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/obs-terms.rst	Wed Jun 05 17:46:06 2019 +0200
@@ -12,39 +12,39 @@
 marker registers a relation between an old obsoleted changeset and its newer
 version.
 
-Old changesets are called **precursors** while their new versions are called
-**successors**. A marker always registers a single *precursor* and:
+Old changesets are called **predecessors** while their new versions are called
+**successors**. A marker always registers a single *predecessor* and:
 
-- no *successor*: the *precursor* is just discarded.
-- one *successor*: the *precursor* has been rewritten
-- multiple *successors*: the *precursor* were splits in multiple
+- no *successor*: the *predecessor* is just discarded.
+- one *successor*: the *predecessor* has been rewritten
+- multiple *successors*: the *predecessor* were splits in multiple
   changesets.
 
-.. The *precursors* and *successors* terms can be used on changeset directly:
+.. The *predecessors* and *successors* terms can be used on changeset directly:
 
-.. :precursors: of a changeset `A` are changesets used as *precursors* by
+.. :predecessors: of a changeset `A` are changesets used as *predecessors* by
 ..              obsolete marker using changeset `A` as *successors*
 
 .. :successors: of a changeset `B` are changesets used as *successors* by
-..              obsolete marker using changeset `B` as *precursors*
+..              obsolete marker using changeset `B` as *predecessors*
 
 Chaining obsolete markers is allowed to rewrite a changeset that is already a
 *successor*. This is a kind of *second order version control*.
-To clarify ambiguous situations one can use **direct precursors** or
+To clarify ambiguous situations one can use **direct predecessors** or
 **direct successors** to name changesets that are directly related.
 
 The set of all *obsolete markers* forms a direct acyclic graph the same way
 standard *parents*/*children* relation does. In this graph we have:
 
-:any precursors: are transitive precursors of a changeset: *direct precursors*
-                 and *precursors* of *precursors*.
+:any predecessors: are transitive predecessors of a changeset: *direct predecessors*
+                 and *predecessors* of *predecessors*.
 
 :any successors: are transitive successors of a changeset: *direct successors*
                  and *successors*  of *successors*)
 
 Obsolete markers may refer changesets that are not known locally.
-So, *direct precursors* of a changeset may be unknown locally.
-This is why we usually focus on the **first known precursors**  of the rewritten
+So, *direct predecessors* of a changeset may be unknown locally.
+This is why we usually focus on the **first known predecessors**  of the rewritten
 changeset. The same apply for *successors*.
 
 Changeset in *any successors* which are not **obsolete** are called
@@ -66,13 +66,13 @@
 |                     |                          |                             |
 | Changeset in either | Obsolete changeset is    | *extinct* changeset is      |
 | *draft* or *secret* | *mutable* used as a      | *obsolete* which has only   |
-| phase.              | *precursor*.             | *obsolete* descendants.     |
+| phase.              | *predecessor*.           | *obsolete* descendants.     |
 |                     |                          |                             |
 |                     | A changeset is used as   | They can safely be:         |
-|                     | a *precursor* when at    |                             |
+|                     | a *predecessor* when at  |                             |
 |                     | least one obsolete       | - hidden in the UI,         |
 |                     | marker refers to it      | - silently excluded from    |
-|                     | as precursors.           |   pull and push operations  |
+|                     | as predecessors.         |   pull and push operations  |
 |                     |                          | - mostly ignored            |
 |                     |                          | - garbage collected         |
 |                     |                          |                             |
@@ -92,30 +92,31 @@
 |                     |                          |                             |
 |                     +--------------------------+-----------------------------+
 |                     |                          |                             |
-|                     | **troubled**             | **unstable**                |
+|                     | **unstable**             | **orphan**                  |
 |                     |                          |                             |
-|                     | *troubled*    has        | *unstable* is a changeset   |
+|                     | *unstable*    has        | *orphan* is a changeset     |
 |                     | unresolved issue caused  | with obsolete ancestors.    |
 |                     | by *obsolete* relations. |                             |
 |                     |                          |                             |
 |                     | Possible issues are      | It must be rebased on a     |
-|                     | listed in the next       | non *troubled*    base to   |
+|                     | listed in the next       | non *unstable*    base to   |
 |                     | column. It is possible   | solve the problem.          |
-|                     | for *troubled*           |                             |
+|                     | for *unstable*           |                             |
 |                     | changeset to combine     | (possible alternative name: |
 |                     | multiple issue at once.  | precarious)                 |
-|                     | (a.k.a. divergent   and  |                             |
-|                     | unstable)                +-----------------------------+
+|                     | (a.k.a. content-divergent|                             |
+|                     | and orphan)              +-----------------------------+
 |                     |                          |                             |
-|                     | (possible alternative    | **bumped**                  |
+|                     | (possible alternative    | **phase-divergent**         |
 |                     | names: unsettled,        |                             |
-|                     | troublesome              | *bumped* is a changeset     |
-|                     |                          | that tries to be successor  |
-|                     |                          | of  public changesets.      |
+|                     | troublesome              | *phase-divergent* is a      |
+|                     |                          | changeset that tries to be  |
+|                     |                          | successor of a public       |
+|                     |                          | changeset.                  |
 |                     |                          |                             |
 |                     |                          | Public changeset can't      |
 |                     |                          | be deleted and replace      |
-|                     |                          | *bumped*                    |
+|                     |                          | *phase-divergent*           |
 |                     |                          | need to be converted into   |
 |                     |                          | an overlay to this public   |
 |                     |                          | changeset.                  |
@@ -125,17 +126,18 @@
 |                     |                          | mindless, disenchanting)    |
 |                     |                          |                             |
 |                     |                          +-----------------------------+
-|                     |                          | **divergent**               |
+|                     |                          | **content-divergent**       |
 |                     |                          |                             |
-|                     |                          | *divergent*   is changeset  |
-|                     |                          | that appears when multiple  |
-|                     |                          | changesets are successors   |
-|                     |                          | of the same precursor.      |
+|                     |                          | *content-divergent*   is a  |
+|                     |                          | changeset that appears when |
+|                     |                          | multiple changesets are     |
+|                     |                          | successors of the same      |
+|                     |                          | predecessor.                |
 |                     |                          |                             |
-|                     |                          | *divergent*   are solved    |
-|                     |                          | through a three ways merge  |
-|                     |                          | between the two             |
-|                     |                          | *divergent*   ,             |
+|                     |                          | *content-divergent*   are   |
+|                     |                          | solved through a three way  |
+|                     |                          | merge between the two       |
+|                     |                          | *content-divergent*   ,     |
 |                     |                          | using the last "obsolete-   |
 |                     |                          | -common-ancestor" as the    |
 |                     |                          | base.                       |
@@ -151,7 +153,7 @@
 |                     +--------------------------+-----------------------------+
 |                     |                                                        |
 |                     | Mutable changesets which are neither *obsolete* or     |
-|                     | *troubled*    are *"ok"*.                              |
+|                     | *unstable*    are *"ok"*.                              |
 |                     |                                                        |
 |                     | Do we really need a name for it ? *"ok"* is a pretty   |
 |                     | crappy name :-/ other possibilities are:               |
@@ -168,8 +170,8 @@
 |                                                                              |
 | Rewriting operation refuse to work on immutable changeset.                   |
 |                                                                              |
-| Obsolete markers that refer an immutable changeset as precursors have        |
-| no effect on the precursors but may have effect on the successors.           |
+| Obsolete markers that refer an immutable changeset as predecessors have      |
+| no effect on the predecessors but may have effect on the successors.         |
 |                                                                              |
 | When a *mutable* changeset becomes *immutable* (changing its phase from draft|
 | to public) it is just *immutable* and loose any property of it's former      |
@@ -226,7 +228,7 @@
 ``````
 
 Automatically resolve *troublesome* changesets
-(*unstable*, *bumped* and *divergent*)
+(*orphan*, *phase-divergent* and *content-divergent*)
 
 This is an important name as hg pull/push will suggest it the same way it
 suggest merging when you add heads.
--- a/docs/sharing.rst	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/sharing.rst	Wed Jun 05 17:46:06 2019 +0200
@@ -433,7 +433,7 @@
 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
-precursor of that changeset ("v2", revision 5:0eb7) is obsolete. Thus,
+predecessor of that changeset ("v2", revision 5:0eb7) is obsolete. Thus,
 Bob pushes to ``review`` as well::
 
   $ hg push ../review
@@ -508,12 +508,12 @@
 but every competent chef keeps several around. Ever try to chop onions
 with a spoon?)
 
-In the user guide, we saw examples of *unstbale* changesets, which are
-the most common type of troubled changeset. (Recall that a
+In the user guide, we saw examples of *orphan* changesets, which are
+the most common type of unstable changeset. (Recall that a
 non-obsolete changeset with obsolete ancestors is an orphan.)
 
-Two other types of troubles can happen: *divergent* and
-*bumped* changesets. Both are more likely with shared mutable
+Two other types of instability can happen: *content-divergent* and
+*phase-divergent* changesets. Both are more likely with shared mutable
 history, especially mutable history shared by multiple developers.
 
 Setting up
@@ -556,11 +556,11 @@
 
 and add the same text.
 
-Example 6: Divergent changesets
-===============================
+Example 6: Content-divergent changesets
+=======================================
 
 When an obsolete changeset has two successors, those successors are
-*divergent*. One way to get into such a situation is by failing
+*content-divergent*. One way to get into such a situation is by failing
 to communicate with your teammates. Let's see how that might happen.
 
 First, we'll have Bob commit a bug fix that could still be improved::
@@ -596,11 +596,11 @@
   [...]
   added 1 changesets with 1 changes to 2 files (+1 heads)
   (run 'hg heads' to see heads, 'hg merge' to merge)
-  2 new divergent changesets
+  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 divergent changesets, 6:a360 and 7:e3f9; wc is at 6:a360; both are successors of obsolete 4:2fe6, hence divergence]
+  [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]
 
 Now we need to get out of trouble. As usual, the answer is to evolve
 history. ::
@@ -619,7 +619,7 @@
 (``internal:other``) that will take Alice's changes over Bob's. (You
 might wonder why Bob wouldn't prefer his own changes by using
 ``internal:local``. He's avoiding a `bug`_ in ``evolve`` that occurs
-when evolving divergent changesets using ``internal:local``.)
+when evolving content-divergent changesets using ``internal:local``.)
 
 # XXX this link does not work
 .. _`bug`: https://bitbucket.org/marmoute/mutable-history/issue/48/
@@ -685,25 +685,25 @@
 2:e011 is now public, so it can't be obsolete. When that changeset was
 obsolete, it made perfect sense for it to have a successor, namely
 Bob's amendment of Alice's fix (changeset 4:fe88). But it's illogical
-for a public changeset to have a successor, so 4:fe88 is troubled:
-it has become *bumped*.
+for a public changeset to have a successor, so 4:fe88 is unstable:
+it has become *phase-divergent*.
 
-  [figure SG07: 2:e011 now public not obsolete, 4:fe88 now bumped]
+  [figure SG07: 2:e011 now public not obsolete, 4:fe88 now phase-divergent]
 
 As usual when there's trouble in your repository, the solution is to
 evolve it::
 
   $ hg evolve --all
 
-Figure 8 illustrates Bob's repository after evolving away the bumped
+Figure 8 illustrates Bob's repository after evolving away the phase-divergent
 changeset. Ignoring the obsolete changesets, Bob now has a nice,
 clean, simple history. His amendment of Alice's bug fix lives on, as
 changeset 5:227d—albeit with a software-generated commit message. (Bob
 should probably amend that changeset to improve the commit message.)
 But the important thing is that his repository no longer has any
-troubled changesets, thanks to ``evolve``.
+unstable changesets, thanks to ``evolve``.
 
-  [figure SG08: 5:227d is new, formerly bumped changeset 4:fe88 now hidden]
+  [figure SG08: 5:227d is new, formerly phase-divergent changeset 4:fe88 now hidden]
 
 Conclusion
 ----------
@@ -713,7 +713,7 @@
 dull knife (never mind a rusty spoon). At the same time, an
 inattentive or careless user can do harm to himself or others.
 Mercurial with ``evolve`` goes to great lengths to limit the harm you
-can do by trying to handle all possible types of “troubled”
+can do by trying to handle all possible types of “unstable”
 changesets. Nevertheless, having a first-aid kit nearby does not mean
 you should stop being careful with sharp knives.
 
--- a/docs/tutorial/draft.md	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/tutorial/draft.md	Wed Jun 05 17:46:06 2019 +0200
@@ -527,7 +527,7 @@
     }
 ~~~
 
-## Unstable
+## Orphan
 
 ~~~graphviz
     digraph G {
@@ -538,21 +538,21 @@
         node[group=main];
         Root -> New;
         node[group=obsolete];
-        Root -> Obsolete -> Unstable;
+        Root -> Obsolete -> Orphan;
 
         // Obsolescence links
         edge[dir=back, style=dotted, arrowtail=dot];
         Obsolete -> New;
 
         Obsolete [fillcolor="#DFDFFF"];
-        Unstable [fillcolor="#FF3535"];
+        Orphan [fillcolor="#FF3535"];
         Root[shape="circle"];
     }
 ~~~
 
-## Bumped
+## Phase-divergent
 
-## Divergent
+## Content-divergent
 
 ~~~graphviz
     digraph G {
@@ -561,17 +561,17 @@
         node[fixedsize=true, style="filled", width=1, height=1, fillcolor="#7F7FFF", shape="pentagon"];
 
         Root -> Base;
-        Root -> Divergent1;
-        Root -> Divergent2;
+        Root -> Content-divergent1;
+        Root -> Content-divergent2;
 
         // Obsolescence links
         edge[dir=back, style=dotted, arrowtail=dot];
-        Base -> Divergent1;
-        Base -> Divergent2;
+        Base -> Content-divergent1;
+        Base -> Content-divergent2;
 
         Base [shape="pentagon", fillcolor="#DFDFFF"];
-        Divergent1 [fillcolor="#FF3535"];
-        Divergent2 [fillcolor="#FF3535"];
+        Content-divergent1 [fillcolor="#FF3535"];
+        Content-divergent2 [fillcolor="#FF3535"];
         Root[shape="circle"];
     }
 ~~~
--- a/docs/tutorial/slides.md	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/tutorial/slides.md	Wed Jun 05 17:46:06 2019 +0200
@@ -275,7 +275,7 @@
 
 Notice the `x` in the log output which shows that a changeset is hidden.
 
-In addition to hiding the original changeset, we are also storing additional information which is recording the relation between a changeset, the **precursor** and its **successor**. It basically stores the information that the commit **X** was rewritten into the commit **Y** by the user **U** at the date **D**. This piece of information is stored in something called an **obsolescence marker**. It will be displayed like this:
+In addition to hiding the original changeset, we are also storing additional information which is recording the relation between a changeset, the **predecessor** and its **successor**. It basically stores the information that the commit **X** was rewritten into the commit **Y** by the user **U** at the date **D**. This piece of information is stored in something called an **obsolescence marker**. It will be displayed like this:
 
 ~~~graphviz-file
 graphs/fix-bug-3.dot
@@ -285,7 +285,7 @@
 
 ##### Rebase
 
-**Successors** don't need to share anything with their **precursor**. They could have a different description message, user, date or even parents.
+**Successors** don't need to share anything with their **predecessor**. They could have a different description message, user, date or even parents.
 
 Let's look at our earlier rebase example. The status before the rebase was:
 
@@ -345,7 +345,7 @@
 output/under-the-hood-amend-after-obslog-patch.log
 ~~~
 
-Obslog works both ways, as it can display **precursors** and **successors** with the `--all` option:
+Obslog works both ways, as it can display **predecessors** and **successors** with the `--all` option:
 
 ```raw-file
 output/under-the-hood-amend-after-obslog-no-all.log
@@ -852,13 +852,13 @@
 output/edit-mid-stack.log
 ```
 
-The message `1 new orphan changesets` means that, by amending a changeset having a child, this child is now **unstable**, as we can see with the `hg stack` command:
+The message `1 new orphan changesets` means that, by amending a changeset having a child, this child is now **orphan**, as we can see with the `hg stack` command:
 
 ```raw-file
 output/edit-mid-stack-after-stack.log
 ```
 
-`hg stack` tries to simplify the view for you. We have amended **b2**, and **b3**'s parent is the precursor version of **b2**, so it is not stable any more. It is now **orphan**.
+`hg stack` tries to simplify the view for you. We have amended **b2**, and **b3**'s parent is the predecessor version of **b2**, so it is not stable any more. It is now **orphan**.
 
 For once, let's use log to see in detail in which situation we are:
 
@@ -909,7 +909,7 @@
 output/basic-stabilize-before-log-obsolete.log
 ```
 
-A changeset can also be **unstable**, meaning that it could be subject to one or more **instabilities**:
+A changeset can also be **orphan**, meaning that it could be subject to one or more **instabilities**:
 
 * **orphan**, a changeset whose an ancestor is **obsolete**.
 * **content-divergent**, a changeset which has been rewritten in two different versions.
@@ -1130,9 +1130,9 @@
 
 À deux:
 
-- troubles, divergence, orphan
-- troubles visualization
-- troubles resolution
+- instability, divergence, orphan
+- instability visualization
+- instability resolution
 - collaboration workflow
 
 Parler du happy path d'abord -->
@@ -1501,7 +1501,7 @@
 $> hg update --rev t1
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 $> hg commit --amend -m "Step1"
-<span style="color:gold;">3 new unstable changesets</span>
+<span style="color:gold;">3 new orphan changesets</span>
 </pre>
 
 #### What have we done?
@@ -1510,11 +1510,11 @@
 $> hg log -G -T compact
 @  <span style="color:olive;">9</span>[tip]     1aa1be5ada40    Step1
 |
-| o  <span style="color:olive;">8</span>        cf90b2de7e65    Step4 <span style="color:red;">(unstable)</span>
+| o  <span style="color:olive;">8</span>        cf90b2de7e65    Step4 <span style="color:red;">(orphan)</span>
 | |
-| o  <span style="color:olive;">7</span>        e208d4205c8e    Step3 <span style="color:red;">(unstable)</span>
+| o  <span style="color:olive;">7</span>        e208d4205c8e    Step3 <span style="color:red;">(orphan)</span>
 | |
-| o  <span style="color:olive;">6</span>        673ff300cf3a    Step2 <span style="color:red;">(unstable)</span>
+| o  <span style="color:olive;">6</span>        673ff300cf3a    Step2 <span style="color:red;">(orphan)</span>
 | |
 | <span style="color:grey;">x  5        8bb88a31dd28    Step</span>
 |/
@@ -1528,9 +1528,9 @@
 $> hg stack
 ###### topic: <span style="color:green;">myfeature</span>
 ###### branch: feature
-<span style="color:olive;">t4</span><span style="color:red;">$</span> Step4<span style="color:red;"> (unstable)</span>
-<span style="color:olive;">t3</span><span style="color:red;">$</span> Step3<span style="color:red;"> (unstable)</span>
-<span style="color:olive;">t2</span><span style="color:red;">$</span> Step2<span style="color:red;"> (unstable)</span>
+<span style="color:olive;">t4</span><span style="color:red;">$</span> Step4<span style="color:red;"> (orphan)</span>
+<span style="color:olive;">t3</span><span style="color:red;">$</span> Step3<span style="color:red;"> (orphan)</span>
+<span style="color:olive;">t2</span><span style="color:red;">$</span> Step2<span style="color:red;"> (orphan)</span>
 <span style="color:teal;">t1</span><span style="color:teal;font-weight:bold;">@</span> <span style="color:teal;">Step1</span><span style="color:teal;font-weight:bold;"> (current)</span>
 <span style="color:grey;">t0^ Trunk</span>
 </pre>
@@ -1545,8 +1545,8 @@
 $> hg stack
 ###### topic: <span style="color:green;">myfeature</span>
 ###### branch: feature
-<span style="color:olive;">t4</span><span style="color:red;">$</span> Step4<span style="color:red;"> (unstable)</span>
-<span style="color:olive;">t3</span><span style="color:red;">$</span> Step3<span style="color:red;"> (unstable)</span>
+<span style="color:olive;">t4</span><span style="color:red;">$</span> Step4<span style="color:red;"> (orphan)</span>
+<span style="color:olive;">t3</span><span style="color:red;">$</span> Step3<span style="color:red;"> (orphan)</span>
 <span style="color:teal;">t2</span><span style="color:teal;font-weight:bold;">@</span> <span style="color:teal;">Step2</span><span style="color:teal;font-weight:bold;"> (current)</span>
 <span style="color:olive;">t1</span><span style="color:green;">:</span> Step1
 <span style="color:grey;">t0^ Trunk</span>
@@ -1566,7 +1566,7 @@
 $> hg stack
 ###### topic: <span style="color:green;">myfeature</span>
 ###### branch: feature
-<span style="color:olive;">t4</span><span style="color:red;">$</span> Step4<span style="color:red;"> (unstable)</span>
+<span style="color:olive;">t4</span><span style="color:red;">$</span> Step4<span style="color:red;"> (orphan)</span>
 <span style="color:teal;">t3</span><span style="color:teal;font-weight:bold;">@</span> <span style="color:teal;">Step3</span><span style="color:teal;font-weight:bold;"> (current)</span>
 <span style="color:olive;">t2</span><span style="color:green;">:</span> Step2
 <span style="color:olive;">t1</span><span style="color:green;">:</span> Step1
@@ -1838,13 +1838,13 @@
 
 <pre>
 $> hg summary
-<span style="color:olive;">parent: 10:890ac95deb83 </span>tip (unstable)
+<span style="color:olive;">parent: 10:890ac95deb83 </span>tip (orphan)
  Head
 branch: feature
 commit: (clean)
 update: (current)
 phases: 9 draft
-unstable: <span style="color:red;">1 changesets</span>
+orphan: <span style="color:red;">1 changesets</span>
 topic:  <span style="color:green;">myfeature</span>
 </pre>
 
@@ -1864,7 +1864,7 @@
    packaging
    prev-next
    split
-   stack_unstable_bug
+   stack_orphan_bug
    tutorial
  * tutorialtypos
 </pre>
@@ -1883,7 +1883,7 @@
    obscache               (2 months ago)
    evolvecolor            (2 months ago)
    obsrangecacheiterative (2 months ago)
-   stack_unstable_bug     (2 months ago)
+   stack_orphan_bug     (2 months ago)
    doc                    (3 months ago)
    split                  (3 months ago)
    import-checker         (4 months ago)
@@ -1906,9 +1906,9 @@
    packaging              (on branch: default, 1 changesets, <span style="color:teal;">2521 behind</span>)
    prev-next              (on branch: default, 4 changesets, <span style="color:teal;">72 behind</span>)
    split                  (on branch: default, 1 changesets, <span style="color:teal;">492 behind</span>)
-   stack_unstable_bug     (on branch: default, 1 changesets, <span style="color:teal;">474 behind</span>)
+   stack_orphan_bug     (on branch: default, 1 changesets, <span style="color:teal;">474 behind</span>)
    tutorial               (on branch: default, 2 changesets, <span style="color:teal;">492 behind</span>)
-<span style="color:green;"> * </span><span style="color:green;">tutorialtypos         </span> (on branch: default, 3 changesets, <span style="color:red;">1 troubled</span>, <span style="color:olive;">2 heads</span>, <span style="color:teal;">2 behind</span>)
+<span style="color:green;"> * </span><span style="color:green;">tutorialtypos         </span> (on branch: default, 3 changesets, <span style="color:red;">1 unstable</span>, <span style="color:olive;">2 heads</span>, <span style="color:teal;">2 behind</span>)
 </pre>
 
 #### Log
@@ -1919,7 +1919,7 @@
 |
 o  23abfc79b7ce
 |
-| o  4302274177b9 <span style="color:red;">(unstable)</span>
+| o  4302274177b9 <span style="color:red;">(orphan)</span>
 | |
 | <span style="color:grey;">x  fba593aaaa10</span>
 |/   rewritten as c55cb2ee8a91;
@@ -1931,10 +1931,10 @@
 <pre>
 $> hg evolve --list
 <span style="color:gold;">9ac0d376e01c</span>: changelog: introduce a 'tiprev' method
-  <span style="color:red;">unstable</span>: <span style="color:grey;">52ec3072fe46</span> (obsolete parent)
+  <span style="color:red;">orphan</span>: <span style="color:grey;">52ec3072fe46</span> (obsolete parent)
 
 <span style="color:gold;">3efd3eab9860</span>: changelog: use 'tiprev()' in 'tip()'
-  <span style="color:red;">unstable</span>: <span style="color:red;">9ac0d376e01c</span> (unstable parent)
+  <span style="color:red;">orphan</span>: <span style="color:red;">9ac0d376e01c</span> (orphan parent)
 </pre>
 
 (see also `hg evolve --list --rev`)
@@ -2025,7 +2025,7 @@
 </table>
 
 
-## Troubles
+## Instability
 
 #### Evolution
 
@@ -2033,7 +2033,7 @@
 
 * Hide **most** of the complexity
 
-* Help with unstable situations
+* Help with orphan situations
 
     - Automatic detection
 
@@ -2041,7 +2041,7 @@
 
 #### instability
 
-(currently: *troubles*)
+(currently: *instability*)
 
 * **Orphans:** ancestors were rewritten
 
@@ -2091,7 +2091,7 @@
 
 <img src="https://media.giphy.com/media/46vrhWWOJ4wHC/giphy.gif">
 
-## extra - Troubles
+## extra - Instability
 
 #### Obsolete
 
@@ -2116,7 +2116,7 @@
     }
 ~~~
 
-#### Unstable
+#### Orphan
 
 Now called `orphan`
 
@@ -2129,19 +2129,19 @@
         node[group=main];
         Root -> New;
         node[group=obsolete];
-        Root -> Obsolete -> Unstable;
+        Root -> Obsolete -> Orphan;
 
         // Obsolescence links
         edge[dir=back, style=dotted, arrowtail=dot];
         Obsolete -> New;
 
         Obsolete [fillcolor="#DFDFFF"];
-        Unstable [fillcolor="#FF3535"];
+        Orphan [fillcolor="#FF3535"];
         Root[shape="circle"];
     }
 ~~~
 
-#### Bumped
+#### Phase-divergent
 
 Now called `Phase-divergent`
 
@@ -2155,22 +2155,22 @@
         Root -> New;
         node[group=obsolete];
         Root -> Obsolete;
-        node[group=bumped];
-        Root -> Bumped;
+        node[group=phase-divergent];
+        Root -> Phase-divergent;
 
         // Obsolescence links
         edge[dir=back, style=dotted, arrowtail=dot];
         Obsolete -> New;
-        Obsolete -> Bumped;
+        Obsolete -> Phase-divergent;
 
         New [shape="circle"];
         Obsolete [fillcolor="#DFDFFF"];
-        Bumped [fillcolor="#FF3535"];
+        Phase-divergent [fillcolor="#FF3535"];
         Root[shape="circle"];
     }
 ~~~
 
-#### Divergent
+#### Content-divergent
 
 Now called `Content-divergent`
 
@@ -2181,17 +2181,17 @@
         node[fixedsize=true, style="filled", width=1, height=1, fillcolor="#7F7FFF", shape="pentagon"];
 
         Root -> Base;
-        Root -> Divergent1;
-        Root -> Divergent2;
+        Root -> Content-divergent1;
+        Root -> Content-divergent2;
 
         // Obsolescence links
         edge[dir=back, style=dotted, arrowtail=dot];
-        Base -> Divergent1;
-        Base -> Divergent2;
+        Base -> Content-divergent1;
+        Base -> Content-divergent2;
 
         Base [shape="pentagon", fillcolor="#DFDFFF"];
-        Divergent1 [fillcolor="#FF3535"];
-        Divergent2 [fillcolor="#FF3535"];
+        Content-divergent1 [fillcolor="#FF3535"];
+        Content-divergent2 [fillcolor="#FF3535"];
         Root[shape="circle"];
     }
 ~~~
--- a/docs/tutorial/test-training.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/tutorial/test-training.t	Wed Jun 05 17:46:06 2019 +0200
@@ -550,7 +550,7 @@
          +Fix bug
   
   
-  $ html_output $TESTDIR/output/amend-obslog-all-after.log obslog --all -G -r "precursors(typo)" --hidden
+  $ html_output $TESTDIR/output/amend-obslog-all-after.log obslog --all -G -r "predecessors(typo)" --hidden
   @  <span style="color:olive;">708369dc1bfe</span> <span style="color:blue;">(17)</span> Fix bug
   |
   x  <span style="color:olive;">5d48a444aba7</span> <span style="color:blue;">(1)</span> Fx bug
@@ -1002,7 +1002,7 @@
 
 Amend
 
-  $ html_output $TESTDIR/output/behind-the-hood-amend-before-hash-hidden.log log -G -r "::precursors(typo)" --hidden
+  $ html_output $TESTDIR/output/behind-the-hood-amend-before-hash-hidden.log log -G -r "::predecessors(typo)" --hidden
   x  <span style="color:olive;">changeset:   1:5d48a444aba7</span>
   |  branch:      typo
   |  user:        Boris Feld &lt;boris.feld@octobus.net&gt;
@@ -1016,7 +1016,7 @@
      summary:     ROOT
   
 
-XXX Remove the command line to avoid showing precursors and hidden revset
+XXX Remove the command line to avoid showing predecessors and hidden revset
 
   $ tail -n +2 $TESTDIR/output/behind-the-hood-amend-before-hash-hidden.log | tee $TESTDIR/output/behind-the-hood-amend-before-hash-hidden.log
   x  <span style="color:olive;">changeset:   1:5d48a444aba7</span>
@@ -1121,7 +1121,7 @@
 
 Rebase  
 
-  $ html_output $TESTDIR/output/behind-the-hood-rebase-before-hash-hidden.log log -G -r "::branch(build/v2) or ::precursors('build/linuxsupport-v2')" --hidden
+  $ html_output $TESTDIR/output/behind-the-hood-rebase-before-hash-hidden.log log -G -r "::branch(build/v2) or ::predecessors('build/linuxsupport-v2')" --hidden
   o  <span style="color:olive;">changeset:   6:0e694460372e</span>
   |  branch:      build/v2
   |  parent:      2:f3bd0ab4ee87
@@ -2455,7 +2455,7 @@
 
   $ html_output $TESTDIR/output/edit-mid-stack-after-stack.log stack
   ### target: build/linuxsupport-v2 (branch)
-  <span style="color:olive;">b3</span><span style="color:red;">$</span> Third commit on build/linuxsupport-v2<span style="color:red;"> (unstable)</span>
+  <span style="color:olive;">b3</span><span style="color:red;">$</span> Third commit on build/linuxsupport-v2<span style="color:red;"> (orphan)</span>
   <span style="color:teal;">b2</span><span style="color:teal;font-weight:bold;">@</span> <span style="color:teal;">Second commit on build/linuxsupport-v2</span><span style="color:teal;font-weight:bold;"> (current)</span>
   <span style="color:olive;">b1</span><span style="color:green;">:</span> First commit on build/linuxsupport-v2
   b0^ New commit on build/v2 (base)
@@ -2550,7 +2550,7 @@
       	19 -> 20	 [penwidth=2.0];
       }
 
-Basic troubles + stabilization
+Basic instability + stabilization
 ------------------------------
 
   $ cp -R $TESTTMP/evolve_training_repo $TESTDIR/base-repos/edit-mid-stack/
@@ -2579,7 +2579,7 @@
 
   $ html_output $TESTDIR/output/basic-stabilize-before-evolve-list.log evolve --list
   3d2c8a2356a2: Third commit on build/linuxsupport-v2
-    unstable: 4686378320d7 (obsolete parent)
+    orphan: 4686378320d7 (obsolete parent)
   
   $ html_output $TESTDIR/output/basic-stabilize-next-evolve.log next --evolve
   move:[<span style="color:blue;">20</span>] Third commit on build/linuxsupport-v2
@@ -2593,7 +2593,7 @@
   <span style="color:olive;">b1</span><span style="color:green;">:</span> First commit on build/linuxsupport-v2
   b0^ New commit on build/v2 (base)
 
-  $ graph $TESTDIR/graphs/basic-stabilize-after-stack.dot -T "{shortest(node, 8)}" -r "(::. + ::precursors(.)) and branch(build/linuxsupport-v2)" --hidden --public=yes
+  $ graph $TESTDIR/graphs/basic-stabilize-after-stack.dot -T "{shortest(node, 8)}" -r "(::. + ::predecessors(.)) and branch(build/linuxsupport-v2)" --hidden --public=yes
   Wrote */graphs/basic-stabilize-after-stack.dot (glob)
   .. graphviz::
   
--- a/docs/user-guide.rst	Tue Apr 23 14:18:11 2019 +0200
+++ b/docs/user-guide.rst	Wed Jun 05 17:46:06 2019 +0200
@@ -239,10 +239,7 @@
 .. figure:: figures/figure-ug02.svg
 
    Figure 2: safe history modification using ``evolve``: the original
-   revision 1 is preserved as an obsolete changeset. (The "temporary
-   amend commit", marked with T, is an implementation detail stemming
-   from limitations in Mercurial's current merge machinery. Future
-   versions of Mercurial will not create them.)
+   revision 1 is preserved as an obsolete changeset.
 
 In this case, the obsolete changesets are also *hidden*. That is the
 usual end state for obsolete changesets. However, many scenarios result
@@ -256,21 +253,19 @@
 
 As the name implies, hidden changesets are normally not visible. If
 you run ``hg log`` on the repository from Figure 2, Mercurial will
-show revisions 0 and 3, but not 1 and 2. That's something you don't
+show revisions 0 and 2, but not 1. That's something you don't
 see with plain vanilla Mercurial—normally, revision *N* is always
 followed by revision *N* + 1.
 
 This is just the visible manifestation of hidden changesets. If
-revision 0 is followed by revision 3, that means there are two hidden
-changesets, 1 and 2, in between.
+revision 0 is followed by revision 2, that means there is a hidden
+changeset, (1) in between.
 
 To see those hidden changesets, use the ``--hidden`` option::
 
   $ hg --hidden log --graph --template '{rev}:{node|short}  {desc|firstline}\n'
-  @  3:934359450037  implement feature Y
+  @  2:934359450037  implement feature Y
   |
-  | x  2:6c5f78d5d467  temporary amend commit for fe0ecd3bd2a4
-  | |
   | x  1:fe0ecd3bd2a4  implement feature Y
   |/
   o  0:08c4b6f4efc8  init
@@ -288,7 +283,7 @@
 
 ``prune`` (example 4 above) is the simplest history modification
 command provided by ``evolve``. All it does is mark the specified
-changeset(s) obsolete, with no successor/precursor relationships
+changeset(s) obsolete, with no successor/predecessor relationships
 involved. (If the working directory parent was one of the obsoleted
 changesets, ``prune`` updates back to a suitable ancestor.)
 
@@ -336,7 +331,7 @@
 So far, every obsolete changeset we have seen is also hidden. However,
 these are *not* the same thing—that's why they have different names.
 It's entirely possible to have obsolete changesets that are not
-hidden. We'll see examples of that soon, when we create *unstable*
+hidden. We'll see examples of that soon, when we create *orphan*
 changesets.
 
 Note that all hidden changesets are obsolete: hidden is a subset of
@@ -349,15 +344,15 @@
 
 Now that you've got a solid understanding of how ``evolve`` works in
 concert with changeset obsolescence, let's explore some more advanced
-scenarios. All of these scenarios will involve *unstable* changesets,
+scenarios. All of these scenarios will involve *orphan* changesets,
 which is an unavoidable consequence of obsolescence. What really sets
 ``evolve`` apart from other history modification mechanisms is the
-fact that it recognizes troubles like unstable changesets and provides
+fact that it recognizes instability like orphan changesets and provides
 a consistent way for you to get back to a stable repository.
 
-(Incidentally, there are two other types of troubles that changesets
-can get into with ``evolve``: they may be *divergent* or
-*bumped*. Both of those states are more likely to occur when
+(Incidentally, there are two other types of instability that changesets
+can get into with ``evolve``: they may be *content-divergent* or
+*phase-divergent*. Both of those states are more likely to occur when
 `sharing mutable history`_, so we won't cover them in this user guide.)
 
 .. _`sharing mutable history`: sharing.html
@@ -393,17 +388,16 @@
   $ hg amend
 
 At this point, revision 11 is *obsolete* and revisions 12 and 13—the
-descendants of 11—are in a funny state: they are *unstable*.
+descendants of 11—are in a funny state: they are *orphan*.
 
 .. figure:: figures/figure-ug06.svg
 
    Figure 6: amending a changeset with descendants means the amended
    changeset is obsolete but remains visible; its non-obsolete
-   descendants are *unstable*. The temporary amend commit, revision
-   14, is hidden because it has no non-obsolete descendants.
+   descendants are *orphan*.
 
 All non-obsolete descendants of an obsolete changeset are considered
-unstable. An interesting consequence of this is that revision 11 is
+orphans. An interesting consequence of this is that revision 11 is
 still visible, even though it is obsolete. Obsolete changesets with
 non-obsolete descendants are not hidden.
 
@@ -420,12 +414,12 @@
 
 The end state, after ``evolve`` finishes, is that the original
 revisions (11-13) are obsolete and hidden. Their successor revisions
-(15-17) replace them.
+(14-16) replace them.
 
 .. figure:: figures/figure-ug07.svg
 
    Figure 7: evolve your repository (``hg evolve --all``) to take care
-   of instability. Unstable changesets become obsolete, and are
+   of instability. Orphan changesets become obsolete, and are
    replaced by successors just like the amended changeset was.
 
 Example 8: Prune an older changeset
@@ -441,19 +435,19 @@
 
   $ hg prune 19
   1 changesets pruned
-  1 new unstable changesets
+  1 new orphan changesets
 
 As above, this leaves your repository in a funny intermediate state:
 revision 20 is the non-obsolete descendant of obsolete revision 19.
-That is, revision 20 is unstable.
+That is, revision 20 is an orphan.
 
 .. figure:: figures/figure-ug08.svg
 
    Figure 8: ``hg prune`` marks a changeset obsolete without creating
    a successor. Just like with ``hg amend``, non-obsolete descendants
-   of the pruned changeset are now unstable.
+   of the pruned changeset are now orphans.
 
-As before, the solution to unstable changesets is to evolve your
+As before, the solution to orphan changesets is to evolve your
 repository::
 
   $ hg evolve --all
@@ -485,11 +479,11 @@
   $ hg update 22
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg uncommit file2.c
-  1 new unstable changesets
+  1 new orphan changesets
   $ hg status
   M file2.c
 
-Now your repository has unstable changesets, so you need to evolve it.
+Now your repository has orphan changesets, so you need to evolve it.
 However, ``hg evolve`` requires a clean working directory to resolve merge
 conflicts, so you need to decide what to do with ``file2.c``.
 
@@ -530,7 +524,7 @@
   $ hg update -q 26
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg uncommit -q file2.c  # obsoletes rev 26, creates rev 28
-  1 new unstable changesets
+  1 new orphan changesets
   $ hg status
   M file2.c
 
@@ -541,7 +535,7 @@
 Figure 11 shows the story so far: ``uncommit`` obsoleted revision 26
 and created revision 28, the successor of 26. Then we committed
 revision 29, a child of 28. We still have to deal with the revision 27,
-which is an unstable changeset.
+which is an orphan changeset.
 
 .. figure:: figures/figure-ug11.svg
 
@@ -549,7 +543,7 @@
    separately will soon result in a two-headed repository.
 
 This is where things get tricky. As usual when a repository has
-unstable changesets, we want to evolve it::
+orphan changesets, we want to evolve it::
 
   $ hg evolve --all
 
@@ -561,7 +555,7 @@
 
 .. figure:: figures/figure-ug12.svg
 
-   Figure 12: ``evolve`` takes care of unstable changesets; it does
+   Figure 12: ``evolve`` takes care of orphan changesets; it does
    not solve all the world's problems.
 
 As usual when faced with a two-headed repository, you can either merge
@@ -594,7 +588,7 @@
 change in the future. Consider the history in Figure 12, where revision 27
 is obsolete and the child of 26, also obsolete. If we ``hg touch 27``, that
 creates a new revision which is a non-obsolete child of 26—i.e., it is an
-unstable. It's also *divergent*, another type of trouble that we'll learn
+orphan. It's also *content-divergent*, another type of trouble that we'll learn
 about in the `next section`_.
 
 .. _`next section`: sharing.html
--- a/hgext3rd/evolve/__init__.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/evolve/__init__.py	Wed Jun 05 17:46:06 2019 +0200
@@ -296,6 +296,7 @@
     metadata,
     obscache,
     obsexchange,
+    obshashtree,
     obshistory,
     rewind,
     rewriteutil,
@@ -345,6 +346,7 @@
 eh.merge(debugcmd.eh)
 eh.merge(evolvecmd.eh)
 eh.merge(obsexchange.eh)
+eh.merge(obshashtree.eh)
 eh.merge(safeguard.eh)
 eh.merge(obscache.eh)
 eh.merge(obshistory.eh)
@@ -497,16 +499,16 @@
 def _installalias(ui):
     if ui.config('alias', 'odiff', None) is None:
         ui.setconfig('alias', 'odiff',
-                     "diff --hidden --rev 'limit(precursors(.),1)' --rev .",
+                     "diff --hidden --rev 'limit(predecessors(.),1)' --rev .",
                      'evolve')
 
-### Troubled revset symbol
+### Unstable revset symbol
 
-@eh.revsetpredicate('troubled()')
-def revsettroubled(repo, subset, x):
-    """Changesets with troubles.
+@eh.revsetpredicate('unstable()')
+def revsetunstable(repo, subset, x):
+    """Changesets with instabilities.
     """
-    revset.getargs(x, 0, 0, 'troubled takes no arguments')
+    revset.getargs(x, 0, 0, 'unstable takes no arguments')
     troubled = set()
     troubled.update(getrevs(repo, 'orphan'))
     troubled.update(getrevs(repo, 'phasedivergent'))
@@ -515,6 +517,10 @@
     troubled.sort() # set is non-ordered, enforce order
     return subset & troubled
 
+@eh.revsetpredicate('troubled()')    # legacy name
+def revsettroubled(repo, subset, x):
+    return revsetunstable(repo, subset, x)
+
 ### Obsolescence graph
 
 # XXX SOME MAJOR CLEAN UP TO DO HERE XXX
@@ -620,9 +626,9 @@
     return subset & suspended
 
 
-@eh.revsetpredicate('precursors(set)')
-def revsetprecursors(repo, subset, x):
-    """Immediate precursors of changesets in set.
+@eh.revsetpredicate('predecessors(set)')
+def revsetpredecessors(repo, subset, x):
+    """Immediate predecessors of changesets in set.
     """
     s = revset.getset(repo, revset.fullreposet(repo), x)
     s = revset.baseset(_precursors(repo, s))
@@ -630,9 +636,14 @@
     return subset & s
 
 
-@eh.revsetpredicate('allprecursors(set)')
-def revsetallprecursors(repo, subset, x):
-    """Transitive precursors of changesets in set.
+@eh.revsetpredicate('precursors(set)')   # legacy name for predecessors
+def revsetprecursors(repo, subset, x):
+    return revsetpredecessors(repo, subset, x)
+
+
+@eh.revsetpredicate('allpredecessors(set)')
+def revsetallpredecessors(repo, subset, x):
+    """Transitive predecessors of changesets in set.
     """
     s = revset.getset(repo, revset.fullreposet(repo), x)
     s = revset.baseset(_allprecursors(repo, s))
@@ -640,6 +651,11 @@
     return subset & s
 
 
+@eh.revsetpredicate('allprecursors(set)')   # legacy name for allpredecessors
+def revsetallprecursors(repo, subset, x):
+    return revsetallpredecessors(repo, subset, x)
+
+
 @eh.revsetpredicate('successors(set)')
 def revsetsuccessors(repo, subset, x):
     """Immediate successors of changesets in set.
@@ -1148,13 +1164,18 @@
     cmdutil.bailifchanged(repo)
     evolvestate = state.cmdstate(repo, opts={'command': 'next',
                                              'bookmarkchanges': []})
-    result = evolvecmd._solveone(ui, repo, repo[aspchildren],
-                                 evolvestate, opts.get('dry_run'), False,
-                                 lambda: None, category='orphan',
-                                 stacktmplt=opts.get('stacktemplate', False))
+    with repo.wlock(), repo.lock():
+        tr = repo.transaction("evolve")
+        with util.acceptintervention(tr):
+            result = evolvecmd._solveone(ui, repo, repo[aspchildren],
+                                         evolvestate, opts.get('dry_run'),
+                                         False,
+                                         lambda: None, category='orphan',
+                                         stacktmplt=opts.get('stacktemplate',
+                                                             False))
     # making sure a next commit is formed
     if result[0] and result[1]:
-        ui.status(_('working directory now at %s\n')
+        ui.status(_('working directory is now at %s\n')
                   % ui.label(str(repo['.']), 'evolve.node'))
     return 0
 
--- a/hgext3rd/evolve/cmdrewrite.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/evolve/cmdrewrite.py	Wed Jun 05 17:46:06 2019 +0200
@@ -149,11 +149,7 @@
 
 def amendpatch(ui, repo, *pats, **opts):
     """logic for --patch flag of `hg amend` command."""
-    lock = wlock = tr = None
-    try:
-        wlock = repo.wlock()
-        lock = repo.lock()
-        tr = repo.transaction('amend')
+    with repo.wlock(), repo.lock(), repo.transaction('amend') as tr:
         cmdutil.bailifchanged(repo)
         # first get the patch
         old = repo['.']
@@ -180,11 +176,6 @@
                              metadata=metadata)
         phases.retractboundary(repo, tr, old.phase(), [newnode])
         hg.updaterepo(repo, newnode, True)
-        tr.close()
-    finally:
-        if tr is not None:
-            tr.release()
-        lockmod.release(lock, wlock)
 
 def _editandapply(ui, repo, pats, old, p1, fp, diffopts):
     newnode = None
@@ -866,11 +857,7 @@
             raise error.Abort(_('revisions must be specified with --fold'))
         revs = ['.']
 
-    wlock = lock = None
-    try:
-        wlock = repo.wlock()
-        lock = repo.lock()
-
+    with repo.wlock(), repo.lock():
         revs = scmutil.revrange(repo, revs)
         if not opts['fold'] and len(revs) > 1:
             # TODO: handle multiple revisions. This is somewhat tricky because
@@ -950,8 +937,6 @@
             ui.status('%i changesets folded\n' % len(revs))
         if newp1 is not None:
             hg.update(repo, newp1)
-    finally:
-        lockmod.release(lock, wlock)
 
 metadataopts = [
     ('d', 'date', '',
@@ -1121,7 +1106,7 @@
                     bmchanges = [(bookactive, newnode.node())]
                     repo._bookmarks.applychanges(repo, tr, bmchanges)
                 commands.update(ui, repo, newnode.hex())
-                ui.status(_('working directory now at %s\n')
+                ui.status(_('working directory is now at %s\n')
                           % ui.label(str(newnode), 'evolve.node'))
                 if movebookmark:
                     bookmarksmod.activate(repo, bookactive)
@@ -1348,8 +1333,6 @@
     This is used to "resurrect" changesets
     """
     _checknotesize(ui, opts)
-    duplicate = opts['duplicate']
-    allowdivergence = opts['allowdivergence']
     revs = list(revs)
     revs.extend(opts['rev'])
     if not revs:
@@ -1358,71 +1341,74 @@
     if not revs:
         ui.write_err('no revision to touch\n')
         return 1
+
+    duplicate = opts['duplicate']
     if not duplicate:
         rewriteutil.precheck(repo, revs, 'touch')
     tmpl = utility.shorttemplate
     displayer = compat.changesetdisplayer(ui, repo, {'template': tmpl})
-    wlock = lock = tr = None
-    try:
-        wlock = repo.wlock()
-        lock = repo.lock()
+    with repo.wlock(), repo.lock():
         tr = repo.transaction('touch')
-        revs.sort() # ensure parent are run first
-        newmapping = {}
-        for r in revs:
-            ctx = repo[r]
-            extra = ctx.extra().copy()
-            extra['__touch-noise__'] = random.randint(0, 0xffffffff)
-            # search for touched parent
-            p1 = ctx.p1().node()
-            p2 = ctx.p2().node()
-            p1 = newmapping.get(p1, p1)
-            p2 = newmapping.get(p2, p2)
+        with util.acceptintervention(tr):
+            touchnodes(ui, repo, revs, displayer, **opts)
+
+def touchnodes(ui, repo, revs, displayer, **opts):
+    duplicate = opts['duplicate']
+    allowdivergence = opts['allowdivergence']
+    revs.sort() # ensure parent are run first
+    newmapping = {}
+    for r in revs:
+        ctx = repo[r]
+        extra = ctx.extra().copy()
+        extra['__touch-noise__'] = random.randint(0, 0xffffffff)
+        # search for touched parent
+        p1 = ctx.p1().node()
+        p2 = ctx.p2().node()
+        p1 = newmapping.get(p1, p1)
+        p2 = newmapping.get(p2, p2)
 
-            if not (duplicate or allowdivergence):
-                # The user hasn't yet decided what to do with the revived
-                # cset, let's ask
-                sset = obsutil.successorssets(repo, ctx.node())
-                nodivergencerisk = (len(sset) == 0
-                                    or (len(sset) == 1
-                                        and len(sset[0]) == 1
-                                        and repo[sset[0][0]].rev() == ctx.rev()
-                                    ))
-                if nodivergencerisk:
+        if not (duplicate or allowdivergence):
+            # The user hasn't yet decided what to do with the revived
+            # cset, let's ask
+            sset = obsutil.successorssets(repo, ctx.node())
+            nodivergencerisk = (len(sset) == 0
+                                or (len(sset) == 1
+                                    and len(sset[0]) == 1
+                                    and repo[sset[0][0]].rev() == ctx.rev()
+                                ))
+            if nodivergencerisk:
+                duplicate = False
+            else:
+                displayer.show(ctx)
+                index = ui.promptchoice(
+                    _("reviving this changeset will create divergence"
+                      " unless you make a duplicate.\n(a)llow divergence or"
+                      " (d)uplicate the changeset? $$ &Allowdivergence $$ "
+                      "&Duplicate"), 0)
+                choice = ['allowdivergence', 'duplicate'][index]
+                if choice == 'allowdivergence':
                     duplicate = False
                 else:
-                    displayer.show(ctx)
-                    index = ui.promptchoice(
-                        _("reviving this changeset will create divergence"
-                          " unless you make a duplicate.\n(a)llow divergence or"
-                          " (d)uplicate the changeset? $$ &Allowdivergence $$ "
-                          "&Duplicate"), 0)
-                    choice = ['allowdivergence', 'duplicate'][index]
-                    if choice == 'allowdivergence':
-                        duplicate = False
-                    else:
-                        duplicate = True
+                    duplicate = True
+
+        extradict = {'extra': extra}
+        new, unusedvariable = rewriteutil.rewrite(repo, ctx, [], ctx,
+                                                  [p1, p2],
+                                                  commitopts=extradict)
+        # store touched version to help potential children
+        newmapping[ctx.node()] = new
 
-            extradict = {'extra': extra}
-            new, unusedvariable = rewriteutil.rewrite(repo, ctx, [], ctx,
-                                                      [p1, p2],
-                                                      commitopts=extradict)
-            # store touched version to help potential children
-            newmapping[ctx.node()] = new
-
-            if not duplicate:
-                metadata = {}
-                if opts.get('note'):
-                    metadata['note'] = opts['note']
-                obsolete.createmarkers(repo, [(ctx, (repo[new],))],
-                                       metadata=metadata, operation="touch")
-            phases.retractboundary(repo, tr, ctx.phase(), [new])
-            if ctx in repo[None].parents():
-                with repo.dirstate.parentchange():
-                    repo.dirstate.setparents(new, node.nullid)
-        tr.close()
-    finally:
-        lockmod.release(tr, lock, wlock)
+        if not duplicate:
+            metadata = {}
+            if opts.get('note'):
+                metadata['note'] = opts['note']
+            obsolete.createmarkers(repo, [(ctx, (repo[new],))],
+                                   metadata=metadata, operation="touch")
+        tr = repo.currenttransaction()
+        phases.retractboundary(repo, tr, ctx.phase(), [new])
+        if ctx in repo[None].parents():
+            with repo.dirstate.parentchange():
+                repo.dirstate.setparents(new, node.nullid)
 
 @eh.command(
     'pick|grab',
--- a/hgext3rd/evolve/evolvecmd.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/evolve/evolvecmd.py	Wed Jun 05 17:46:06 2019 +0200
@@ -64,6 +64,8 @@
                  formed. newnode can be node, when resolution led to no new
                  commit. If bool is False, this is ".".
     """
+    tr = repo.currenttransaction()
+    assert tr is not None
     displayer = None
     if stacktmplt:
         displayer = compat.changesetdisplayer(ui, repo,
@@ -71,21 +73,20 @@
     else:
         displayer = compat.changesetdisplayer(ui, repo,
                                               {'template': shorttemplate})
-    with repo.wlock(), repo.lock(), repo.transaction("evolve"):
-        if 'orphan' == category:
-            result = _solveunstable(ui, repo, ctx, evolvestate, displayer,
-                                    dryrun, confirm, progresscb,
-                                    lastsolved=lastsolved)
-        elif 'phasedivergent' == category:
-            result = _solvephasedivergence(ui, repo, ctx, evolvestate,
-                                           displayer, dryrun, confirm,
-                                           progresscb)
-        elif 'contentdivergent' == category:
-            result = _solvedivergent(ui, repo, ctx, evolvestate, displayer,
-                                     dryrun, confirm, progresscb)
-        else:
-            assert False, "unknown trouble category: %s" % (category)
-        return result
+    if 'orphan' == category:
+        result = _solveunstable(ui, repo, ctx, evolvestate, displayer,
+                                dryrun, confirm, progresscb,
+                                lastsolved=lastsolved)
+    elif 'phasedivergent' == category:
+        result = _solvephasedivergence(ui, repo, ctx, evolvestate,
+                                       displayer, dryrun, confirm,
+                                       progresscb)
+    elif 'contentdivergent' == category:
+        result = _solvedivergent(ui, repo, ctx, evolvestate, displayer,
+                                 dryrun, confirm, progresscb)
+    else:
+        assert False, "unknown trouble category: %s" % (category)
+    return result
 
 def _solveunstable(ui, repo, orig, evolvestate, displayer, dryrun=False,
                    confirm=False, progresscb=None, lastsolved=None):
@@ -166,10 +167,10 @@
             displayer.show(target)
     if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y':
         raise error.Abort(_('evolve aborted by user'))
-    if progresscb:
-        progresscb()
     todo = 'hg rebase -r %s -d %s\n' % (orig, target)
     if dryrun:
+        if progresscb:
+            progresscb()
         repo.ui.write(todo)
         return (False, ".")
     else:
@@ -180,12 +181,11 @@
             newid = relocate(repo, orig, target, evolvestate, pctx,
                              keepbranch, 'orphan')
             return (True, newid)
-        except MergeFailure:
+        except error.InterventionRequired:
             ops = {'current': orig.node()}
             evolvestate.addopts(ops)
             evolvestate.save()
-            raise error.InterventionRequired(_("fix conflicts and see `hg help "
-                                               "evolve.interrupted`"))
+            raise
 
 def _solvephasedivergence(ui, repo, bumped, evolvestate, displayer,
                           dryrun=False, confirm=False, progresscb=None):
@@ -204,7 +204,7 @@
         msg = _('skipping %s : we do not handle merge yet\n') % bumped
         ui.write_err(msg)
         return (False, ".")
-    prec = repo.set('last(allprecursors(%d) and public())', bumped.rev()).next()
+    prec = repo.set('last(allpredecessors(%d) and public())', bumped.rev()).next()
     # For now we deny target merge
     if len(prec.parents()) > 1:
         msg = _('skipping: %s: public version is a merge, '
@@ -249,12 +249,11 @@
                                        operation='evolve')
                 bumped = new
                 evolvestate['temprevs'].append(newnode)
-        except MergeFailure:
+        except error.InterventionRequired:
             evolvestate['current'] = bumped.hex()
             evolvestate['precursor'] = prec.hex()
             evolvestate.save()
-            raise error.InterventionRequired(_("fix conflicts and see `hg help "
-                                               "evolve.interrupted`"))
+            raise
 
     return _resolvephasedivergent(ui, repo, prec, bumped)
 
@@ -276,43 +275,22 @@
     newid = None
     replacementnode = None
 
-    # Create the new commit context
-    files = set()
-    copied = copies.pathcopies(prec, bumped)
-    precmanifest = prec.manifest().copy()
-    # 3.3.2 needs a list.
-    # future 3.4 don't detect the size change during iteration
-    # this is fishy
-    for key, val in list(bumped.manifest().iteritems()):
-        precvalue = precmanifest.get(key, None)
-        if precvalue is not None:
-            del precmanifest[key]
-        if precvalue != val:
-            files.add(key)
-    files.update(precmanifest)  # add missing files
-
-    # commit it
-    if files: # something to commit!
-        def filectxfn(repo, ctx, path):
-            if path in bumped:
-                fctx = bumped[path]
-                flags = fctx.flags()
-                mctx = compat.memfilectx(repo, ctx, fctx, flags, copied, path)
-                return mctx
-            return None
+    # Create the new commit context. This is done by applying the changes from
+    # the precursor to the bumped node onto the precursor. This is effectively
+    # like reverting to the bumped node.
+    wctx = context.overlayworkingctx(repo)
+    wctx.setbase(prec)
+    merge.update(repo, bumped.node(), ancestor=prec, mergeancestor=True,
+                 branchmerge=True, force=False, wc=wctx)
+    if not wctx.isempty():
         text = '%s update to %s:\n\n' % (TROUBLES['PHASEDIVERGENT'], prec)
         text += bumped.description()
-
-        new = context.memctx(repo,
-                             parents=[prec.node(), nodemod.nullid],
-                             text=text,
-                             files=files,
-                             filectxfn=filectxfn,
-                             user=bumped.user(),
-                             date=bumped.date(),
-                             extra=bumped.extra())
-
-        newid = repo.commitctx(new)
+        memctx = wctx.tomemctx(text,
+                               parents=(prec.node(), nodemod.nullid),
+                               date=bumped.date(),
+                               extra=bumped.extra(),
+                               user=bumped.user())
+        newid = repo.commitctx(memctx)
         replacementnode = newid
     if newid is None:
         repo.ui.status(_('no changes to commit\n'))
@@ -535,11 +513,10 @@
         try:
             newother = relocate(repo, other, divergent.p1(), evolvestate,
                                 keepbranch=True)
-        except MergeFailure:
+        except error.InterventionRequired:
             evolvestate['current'] = other.node()
             evolvestate.save()
-            raise error.InterventionRequired(_("fix conflicts and see `hg help "
-                                               "evolve.interrupted`"))
+            raise
         evolvestate['old-other'] = other.node()
         other = repo[newother]
         evolvestate['relocating'] = False
@@ -554,16 +531,26 @@
     if not haspubdiv:
         return (res, newnode)
     else:
-        # when we have content-divergence with a public cset: after completing
-        # content divergence resolution the resulting node will be phase
-        # divergent with that same public cset.
-        # here newnode is phase divergent, lets resolve this divergence.
+        # we have content-divergence with a public cset:
+        # after performing content divergence resolution steps, possbile cases:
+        # 1) merging results in a new node:
+        #       we need to perform phase divergence resolution
+        # 2) merging leads to same content as public cset:
+        #       divergence has been resolved by creating markers
         if not res:
             # resolution was not successful, return
             return (res, newnode)
         if newnode == publicdiv.node():
-            # no changes were found that are different from public cset
+            # case 2)
+            pubstr = str(publicdiv)
+            othstr = str(other)
+            msg = _('content divergence resolution between %s '
+                    '(public) and %s has same content as %s, '
+                    'discarding %s\n')
+            msg %= (pubstr, othstr, pubstr, othstr)
+            repo.ui.status(msg)
             return (res, newnode)
+        # case 1)
         prec = publicdiv
         bumped = repo[newnode]
         return _resolvephasedivergent(ui, repo, prec=prec, bumped=bumped)
@@ -571,12 +558,12 @@
 def _mergecontentdivergents(repo, progresscb, divergent, other, base,
                             evolvestate):
     if divergent not in repo[None].parents():
-        repo.ui.status(_("updating to \"local\" side of the conflict: %s\n") %
-                       divergent.hex()[:12])
+        repo.ui.note(_("updating to \"local\" side of the conflict: %s\n") %
+                     divergent.hex()[:12])
         hg.updaterepo(repo, divergent.node(), False)
     # merging the two content-divergent changesets
-    repo.ui.status(_("merging \"other\" %s changeset '%s'\n") %
-                   (TROUBLES['CONTENTDIVERGENT'], other.hex()[:12]))
+    repo.ui.note(_("merging \"other\" %s changeset '%s'\n") %
+                 (TROUBLES['CONTENTDIVERGENT'], other.hex()[:12]))
     if progresscb:
         progresscb()
     mergeancestor = repo.changelog.isancestor(divergent.node(), other.node())
@@ -590,8 +577,6 @@
 
     # conflicts while merging content-divergent changesets
     if compat.hasconflict(stats):
-        tr = repo.currenttransaction()
-        tr.close()
         evolvestate.save()
         raise error.InterventionRequired(_("fix conflicts and see `hg help "
                                            "evolve.interrupted`"))
@@ -626,10 +611,7 @@
         s = publicdiv.status()
         if not (s.added or s.removed or s.deleted or s.modified):
             # warn user if metadata is being lost
-            if otherdiv.description() != publicdiv.description():
-                msg = _('content-divergent changesets differ by descriptions '
-                        'only, discarding %s\n') % str(otherdiv)
-                repo.ui.warn(msg)
+            warnmetadataloss(repo, publicdiv, otherdiv)
             # no changes, create markers to resolve divergence
             obsolete.createmarkers(repo, [(otherdiv, (publicdiv,))],
                                    operation='evolve')
@@ -646,13 +628,14 @@
         desc = mergecommitmessages(ui, base.description(),
                                    divergent.description(),
                                    other.description())
+        user = utility.mergeusers(ui, base, divergent, other)
 
         # new node if any formed as the replacement
         newnode = None
 
         mergehook(repo, base, divergent, other)
 
-        newnode = repo.commit(text=desc, user=other.user())
+        newnode = repo.commit(text=desc, user=user)
         if newnode == divergent.node() or newnode is None:
             # no changes
             new = divergent
@@ -686,6 +669,45 @@
     finally:
         repo.ui.restoreconfig(emtpycommitallowed)
 
+def warnmetadataloss(repo, local, other):
+    """warn the user for the metadata being lost while resolving
+    public content-divergence"""
+
+    # needtowarn: aspects where we need to warn user
+    needtowarn = ['branch', 'topic', 'close']
+    aspects = set()
+    localextra = local.extra()
+    otherextra = other.extra()
+
+    for asp in needtowarn:
+        otherasp = otherextra.get(asp)
+        localasp = localextra.get(asp)
+        if otherasp and otherasp != localasp:
+            aspects.add(asp)
+
+    if other.description() != local.description():
+        aspects.add('description')
+
+    if aspects:
+        # warn user
+        locstr = str(local)
+        othstr = str(other)
+        if 'close' in aspects:
+            filteredasp = aspects - {'close'}
+            if filteredasp:
+                msg = _('other divergent changeset %s is a closed branch head '
+                        'and differs from local %s by "%s" only,' %
+                        (othstr, locstr, ', '.join(sorted(filteredasp))))
+            else:
+                msg = _('other divergent changeset %s is a closed branch head '
+                        'and has same content as local %s,' % (othstr, locstr))
+        else:
+            msg = _('other divergent changeset %s has same content as local %s'
+                    ' and differs by "%s" only,' %
+                    (othstr, locstr, ', '.join(sorted(aspects))))
+        msg += _(' discarding %s\n' % othstr)
+        repo.ui.warn(msg)
+
 def bypassphase(repo, relation, flag=0, metadata=None, operation='evolve'):
     """function to create a single obsmarker relation even for public csets
     where relation should be a single pair (prec, succ)"""
@@ -868,9 +890,6 @@
 
     return desc
 
-class MergeFailure(error.Abort):
-    pass
-
 def _orderrevs(repo, revs):
     """Compute an ordering to solve instability for the given revs
 
@@ -956,25 +975,18 @@
 
     tr = repo.currenttransaction()
     assert tr is not None
-    try:
-        r = _evolvemerge(repo, orig, dest, pctx, keepbranch)
-        if compat.hasconflict(r): # some conflict
-            raise error.Abort(_('unresolved merge conflicts '
-                                '(see hg help resolve)'))
-        nodenew = _relocatecommit(repo, orig, commitmsg)
-    except error.Abort as exc:
+    r = _evolvemerge(repo, orig, dest, pctx, keepbranch)
+    if compat.hasconflict(r): # some conflict
         with repo.dirstate.parentchange():
             repo.setparents(dest.node(), orig.node())
             repo.dirstate.write(tr)
             # fix up dirstate for copies and renames
-            copies.duplicatecopies(repo, repo[None], dest.rev(), orig.p1().rev())
+            copies.duplicatecopies(repo, repo[None], dest.rev(),
+                                   orig.p1().rev())
             dirstatedance(repo, dest, orig.node(), None)
-
-        class LocalMergeFailure(MergeFailure, exc.__class__):
-            pass
-        exc.__class__ = LocalMergeFailure
-        tr.close() # to keep changes in this transaction (e.g. dirstate)
-        raise
+        raise error.InterventionRequired(_("fix conflicts and see `hg help "
+                                           "evolve.interrupted`"))
+    nodenew = _relocatecommit(repo, orig, commitmsg)
     _finalizerelocate(repo, orig, dest, nodenew, tr, category, evolvestate)
     return nodenew
 
@@ -1109,7 +1121,7 @@
     XXX this woobly function won't survive XXX
     """
     repo = ctx._repo.unfiltered()
-    for base in repo.set('reverse(allprecursors(%d))', ctx.rev()):
+    for base in repo.set('reverse(allpredecessors(%d))', ctx.rev()):
         newer = obsutil.successorssets(ctx._repo, base.node())
         # drop filter and solution including the original ctx
         newer = [n for n in newer if n and ctx.node() not in n]
@@ -1186,7 +1198,7 @@
         "orphan": repo.revs("orphan()"),
         "contentdivergent": repo.revs("contentdivergent()"),
         "phasedivergent": repo.revs("phasedivergent()"),
-        "all": repo.revs("troubled()"),
+        "all": repo.revs("unstable()"),
     }
 
     hintmap = {
@@ -1307,7 +1319,7 @@
         ctx = repo[rev]
         unpars = _preparelistctxs(ctx.parents(), lambda p: p.orphan())
         obspars = _preparelistctxs(ctx.parents(), lambda p: p.obsolete())
-        imprecs = _preparelistctxs(repo.set("allprecursors(%n)", ctx.node()),
+        imprecs = _preparelistctxs(repo.set("allpredecessors(%n)", ctx.node()),
                                    lambda p: not p.mutable())
         dsets = divergentsets(repo, ctx)
 
@@ -1436,10 +1448,7 @@
 
     return opts
 
-def _cleanup(ui, repo, startnode, showprogress, shouldupdate):
-    if showprogress:
-        compat.progress(ui, _('evolve'), None)
-
+def _cleanup(ui, repo, startnode, shouldupdate):
     if not shouldupdate:
         # Move back to startnode, or to its successor if the start node is
         # obsolete (perhaps made obsolete by the current `hg evolve`)
@@ -1491,9 +1500,9 @@
      ('', 'content-divergent', False, _('solves only content-divergent changesets')),
      ('', 'unstable', False, _('solves only unstable changesets (DEPRECATED)')),
      ('', 'orphan', False, _('solves only orphan changesets (default)')),
-     ('a', 'all', False, _('evolve all troubled changesets related to the '
-                           'current  working directory and its descendants')),
-     ('', 'update', True, _('update to the head of evolved changesets')),
+     ('a', 'all', None, _('evolve all troubled changesets related to the current'
+                          ' working directory and its descendants (default)')),
+     ('', 'update', False, _('update to the head of evolved changesets')),
      ('c', 'continue', False, _('continue an interrupted evolution')),
      ('', 'stop', False, _('stop the interrupted evolution')),
      ('', 'abort', False, _('abort the interrupted evolution')),
@@ -1526,8 +1535,8 @@
     intention, and gives a hint about what you might want to do next.
 
     Any time evolve creates a changeset, it updates the working copy to the new
-    changeset. (Currently, every successful evolve operation involves an update
-    as well; this may change in future.)
+    changeset. Using ``--update`` will make evolve perform an update after any
+    successful evolve operation.
 
     Automatic mode only handles common use cases. For example, it avoids taking
     action in the case of ambiguity, and it ignores orphan changesets that are
@@ -1536,9 +1545,9 @@
     unless you explicitly request such behavior (see below).
 
     Eliminating all instability around your working copy may require multiple
-    invocations of :hg:`evolve`. Alternately, use ``--all`` to recursively
-    select and evolve all orphan changesets that can be rebased onto the
-    working copy parent.
+    invocations of :hg:`evolve` if you use ``--rev`` or ``--no-all``. Use
+    ``--all`` (which is the default behavior) to recursively select and evolve
+    all orphan changesets that can be rebased onto the working copy parent.
     This is more powerful than successive invocations, since ``--all`` handles
     ambiguous cases (e.g. orphan changesets with multiple children) by evolving
     all branches.
@@ -1601,6 +1610,8 @@
     contopt = opts['continue']
     anyopt = opts['any']
     allopt = opts['all']
+    if allopt is None:
+        allopt = True
     startnode = repo['.'].node()
     dryrunopt = opts['dry_run']
     confirmopt = opts['confirm']
@@ -1630,16 +1641,6 @@
         return solveobswdp(ui, repo, opts)
 
     ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'evolve')
-    troubled = set(repo.revs('troubled()'))
-
-    # Progress handling
-    seen = 1
-    count = allopt and len(troubled) or 1
-    showprogress = allopt
-
-    def progresscb():
-        if revopt or allopt:
-            compat.progress(ui, _('evolve'), seen, unit=_('changesets'), total=count)
 
     evolvestate = state.cmdstate(repo)
     # Continuation handling
@@ -1647,7 +1648,7 @@
         if not evolvestate:
             raise error.Abort(_('no interrupted evolve to continue'))
         evolvestate.load()
-        continueevolve(ui, repo, evolvestate, progresscb)
+        continueevolve(ui, repo, evolvestate)
         if evolvestate['command'] != 'evolve':
             evolvestate.delete()
             return
@@ -1693,8 +1694,16 @@
         if not revs:
             return _handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat)
 
-        # For the progress bar to show
+        # Progress handling
+        seen = 1
+        showprogress = allopt or revopt
         count = len(revs)
+
+        def progresscb():
+            if showprogress:
+                compat.progress(ui, _('evolve'), seen, unit=_('changesets'),
+                                total=count)
+
         # Order the revisions
         revs = _orderrevs(repo, revs)
 
@@ -1711,42 +1720,60 @@
         lastsolved = None
 
         activetopic = getattr(repo, 'currenttopic', '')
-        for rev in revs:
-            curctx = repo[rev]
-            revtopic = getattr(curctx, 'topic', lambda: '')()
-            topicidx = getattr(curctx, 'topicidx', lambda: None)()
-            stacktmplt = False
-            # check if revision being evolved is in active topic to make sure
-            # that we can use stack aliases s# in evolve msgs.
-            if activetopic and (activetopic == revtopic) and topicidx is not None:
-                stacktmplt = True
-            progresscb()
-            ret = _solveone(ui, repo, curctx, evolvestate, dryrunopt,
-                            confirmopt, progresscb, targetcat,
-                            lastsolved=lastsolved, stacktmplt=stacktmplt)
-            seen += 1
-            if ret[0]:
-                evolvestate['replacements'][curctx.node()] = ret[1]
-                lastsolved = ret[1]
-            else:
-                evolvestate['skippedrevs'].append(curctx.node())
+        with repo.wlock(), repo.lock():
+            tr = repo.transaction("evolve")
+            with util.acceptintervention(tr):
+                for rev in revs:
+                    lastsolved = _solveonerev(ui, repo, rev, evolvestate,
+                                              activetopic, dryrunopt,
+                                              confirmopt, progresscb,
+                                              targetcat, lastsolved)
+                    seen += 1
+
+        if showprogress:
+            compat.progress(ui, _('evolve'), None)
+
+    _cleanup(ui, repo, startnode, shouldupdate)
+
+def _solveonerev(ui, repo, rev, evolvestate, activetopic, dryrunopt, confirmopt,
+                 progresscb, targetcat, lastsolved):
+    """solves one trouble, including orphan merges
 
-            if evolvestate['orphanmerge']:
-                # we were processing an orphan merge with both parents obsolete,
-                # stabilized for second parent, re-stabilize for the first parent
-                ret = _solveone(ui, repo, repo[ret[1]], evolvestate, dryrunopt,
-                                confirmopt, progresscb, targetcat,
-                                stacktmplt=stacktmplt)
-                if ret[0]:
-                    evolvestate['replacements'][curctx.node()] = ret[1]
-                    lastsolved = ret[1]
-                else:
-                    evolvestate['skippedrevs'].append(curctx.node())
+    Like _solveone(), this solves one trouble. Unlike _solveone(), it
+    stabilizes for both parents of orphan merges.
+    """
+    curctx = repo[rev]
+    revtopic = getattr(curctx, 'topic', lambda: '')()
+    topicidx = getattr(curctx, 'topicidx', lambda: None)()
+    stacktmplt = False
+    # check if revision being evolved is in active topic to make sure
+    # that we can use stack aliases s# in evolve msgs.
+    if activetopic and (activetopic == revtopic) and topicidx is not None:
+        stacktmplt = True
+    progresscb()
+    ret = _solveone(ui, repo, curctx, evolvestate, dryrunopt,
+                    confirmopt, progresscb, targetcat,
+                    lastsolved=lastsolved, stacktmplt=stacktmplt)
+    if ret[0]:
+        evolvestate['replacements'][curctx.node()] = ret[1]
+        lastsolved = ret[1]
+    else:
+        evolvestate['skippedrevs'].append(curctx.node())
 
-                evolvestate['orphanmerge'] = False
+    if evolvestate['orphanmerge']:
+        # we were processing an orphan merge with both parents obsolete,
+        # stabilized for second parent, re-stabilize for the first parent
+        ret = _solveone(ui, repo, repo[ret[1]], evolvestate, dryrunopt,
+                        confirmopt, progresscb, targetcat,
+                        stacktmplt=stacktmplt)
+        if ret[0]:
+            evolvestate['replacements'][curctx.node()] = ret[1]
+            lastsolved = ret[1]
+        else:
+            evolvestate['skippedrevs'].append(curctx.node())
 
-    progresscb()
-    _cleanup(ui, repo, startnode, showprogress, shouldupdate)
+        evolvestate['orphanmerge'] = False
+    return lastsolved
 
 def solveobswdp(ui, repo, opts):
     """this function updates to the successor of obsolete wdir parent"""
@@ -1867,16 +1894,11 @@
                 # no backup of evolved cset versions needed
                 repair.strip(repo.ui, repo, strippoints, False)
 
-            tr = None
-            try:
-                tr = repo.transaction('evolve')
+            with repo.transaction('evolve') as tr:
                 # restoring bookmarks at there original place
                 bmchanges = evolvestate['bookmarkchanges']
                 if bmchanges:
                     repo._bookmarks.applychanges(repo, tr, bmchanges)
-                tr.close()
-            finally:
-                tr.release()
 
             evolvestate.delete()
             ui.status(_('evolve aborted\n'))
@@ -1886,7 +1908,7 @@
             raise error.Abort(_("unable to abort interrupted evolve, use 'hg "
                                 "evolve --stop' to stop evolve"))
 
-def continueevolve(ui, repo, evolvestate, progresscb):
+def continueevolve(ui, repo, evolvestate):
     """logic for handling of `hg evolve --continue`"""
 
     with repo.wlock(), repo.lock():
@@ -1898,22 +1920,34 @@
         elif evolvestate['category'] == 'phasedivergent':
             _completephasedivergent(ui, repo, evolvestate)
         elif evolvestate['category'] == 'contentdivergent':
-            _continuecontentdivergent(ui, repo, evolvestate, progresscb)
+            _continuecontentdivergent(ui, repo, evolvestate, None)
         else:
             repo.ui.status(_("continuing interrupted '%s' resolution is not yet"
                              " supported\n") % evolvestate['category'])
             return
 
         # make sure we are continuing evolve and not `hg next --evolve`
-        if evolvestate['command'] == 'evolve':
-            category = evolvestate['category']
-            confirm = evolvestate['confirm']
-            unfi = repo.unfiltered()
-            # lastsolved: keep track of successor of last troubled cset we
-            # evolved to confirm that if atop msg should be suppressed to remove
-            # redundancy
-            lastsolved = None
-            activetopic = getattr(repo, 'currenttopic', '')
+        if evolvestate['command'] != 'evolve':
+            return
+
+        # Progress handling
+        seen = 1
+        count = len(evolvestate['revs'])
+
+        def progresscb():
+            compat.progress(ui, _('evolve'), seen, unit=_('changesets'),
+                            total=count)
+
+        category = evolvestate['category']
+        confirm = evolvestate['confirm']
+        unfi = repo.unfiltered()
+        # lastsolved: keep track of successor of last troubled cset we
+        # evolved to confirm that if atop msg should be suppressed to remove
+        # redundancy
+        lastsolved = None
+        activetopic = getattr(repo, 'currenttopic', '')
+        tr = repo.transaction("evolve")
+        with util.acceptintervention(tr):
             for rev in evolvestate['revs']:
                 # XXX: prevent this lookup by storing nodes instead of revnums
                 curctx = unfi[rev]
@@ -1937,13 +1971,12 @@
                         lastsolved = newnode[1]
                     else:
                         evolvestate['skippedrevs'].append(curctx.node())
-        return
+                seen += 1
 
 def _continuecontentdivergent(ui, repo, evolvestate, progresscb):
     """function to continue the interrupted content-divergence resolution."""
-    tr = None
-    try:
-        tr = repo.transaction('evolve')
+    tr = repo.transaction('evolve')
+    with util.acceptintervention(tr):
         divergent = evolvestate['divergent']
         base = evolvestate['base']
         repo = repo.unfiltered()
@@ -1986,10 +2019,7 @@
                 prec = repo[publicnode]
                 bumped = repo[newnode]
                 ret = _resolvephasedivergent(ui, repo, prec=prec, bumped=bumped)
-        tr.close()
         return ret
-    finally:
-        tr.release()
 
 def _completephasedivergent(ui, repo, evolvestate):
     """function to complete the interrupted phase-divergence resolution.
@@ -1997,10 +2027,8 @@
     First completes the relocation of the commit and then process resolving
     phase-divergence"""
 
-    tr = None
-    try:
-        # need to start transaction for bookmark changes
-        tr = repo.transaction('evolve')
+    # need to start transaction for bookmark changes
+    with repo.transaction('evolve'):
         node = _completerelocation(ui, repo, evolvestate)
         evolvestate['temprevs'].append(node)
         # resolving conflicts can lead to empty wdir and node can be None in
@@ -2013,9 +2041,6 @@
         prec = repo[evolvestate['precursor']]
         retvalue = _resolvephasedivergent(ui, repo, prec, newctx)
         evolvestate['replacements'][ctx.node()] = retvalue[1]
-        tr.close()
-    finally:
-        tr.release()
 
 def _completeorphan(ui, repo, evolvestate):
     """function to complete the interrupted orphan resolution"""
--- a/hgext3rd/evolve/legacy.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/evolve/legacy.py	Wed Jun 05 17:46:06 2019 +0200
@@ -15,12 +15,6 @@
 
 from mercurial import error
 
-try:
-    from mercurial import obsolete
-    obsolete._enabled
-except ImportError:
-    raise error.Abort('Obsolete extension requires Mercurial 2.3 (or later)')
-
 import sys
 import json
 
--- a/hgext3rd/evolve/metadata.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/evolve/metadata.py	Wed Jun 05 17:46:06 2019 +0200
@@ -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__ = '8.5.1.dev'
-testedwith = '4.4.2 4.5.2 4.6.2 4.7 4.8 4.9 5.0'
-minimumhgversion = '4.4'
+__version__ = '8.6.0.dev'
+testedwith = '4.5.2 4.6.2 4.7 4.8 4.9 5.0'
+minimumhgversion = '4.5'
 buglink = 'https://bz.mercurial-scm.org/'
--- a/hgext3rd/evolve/obsdiscovery.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/evolve/obsdiscovery.py	Wed Jun 05 17:46:06 2019 +0200
@@ -17,7 +17,6 @@
 
 import hashlib
 import heapq
-import inspect
 import sqlite3
 import struct
 import weakref
@@ -30,7 +29,6 @@
     node,
     obsolete,
     scmutil,
-    setdiscovery,
     util,
 )
 from mercurial.i18n import _
@@ -53,12 +51,6 @@
     wireprotov1server = wireprototypes
     from mercurial.wireproto import wirepeer, encodelist, decodelist
 
-try:
-    from mercurial import dagutil
-    dagutil.revlogdag
-except (ImportError, AttributeError): # <= hg-4.7
-    from . import dagutil
-
 _pack = struct.pack
 _unpack = struct.unpack
 _calcsize = struct.calcsize
@@ -77,81 +69,6 @@
 ###  Code performing discovery ###
 ##################################
 
-def findcommonobsmarkers(ui, local, remote, probeset,
-                         initialsamplesize=100,
-                         fullsamplesize=200):
-    # from discovery
-    roundtrips = 0
-    cl = local.changelog
-    dag = dagutil.revlogdag(cl)
-    missing = set()
-    common = set()
-    undecided = set(probeset)
-    totalnb = len(undecided)
-    heads = [rev for rev in cl.headrevs() if rev != node.nullrev]
-    compat.progress(ui, _("comparing with other"), 0, total=totalnb,
-                    unit=_("changesets"))
-    if util.safehasattr(setdiscovery, '_takefullsample'):
-        # hg compat <= hg-4.9 (e5ece0f46b40)
-        _takefullsample = setdiscovery._takefullsample
-    else:
-        obsdiscov = setdiscovery.partialdiscovery(local, heads)
-        _takefullsample = obsdiscov.takefullsample
-    if remote.capable('_evoext_obshash_1'):
-        getremotehash = remote.evoext_obshash1
-        localhash = _obsrelsethashtreefm1(local)
-    else:
-        getremotehash = remote.evoext_obshash
-        localhash = _obsrelsethashtreefm0(local)
-
-    while undecided:
-
-        ui.note(_("sampling from both directions\n"))
-        if len(undecided) < fullsamplesize:
-            sample = set(undecided)
-        else:
-            if util.safehasattr(setdiscovery, '_takefullsample'):
-                # compat <= hg-4.9 (e5ece0f46b40)
-                if len(inspect.getargspec(_takefullsample)[0]) == 4:
-                    # Mercurial 4.8 changed calling convention.
-                    sample = _takefullsample(local, None, undecided,
-                                             size=fullsamplesize)
-                else:
-                    # hg <= 4.7 version
-                    sample = _takefullsample(dag, undecided,
-                                             size=fullsamplesize)
-            else:
-                sample = _takefullsample(None, size=fullsamplesize)
-
-        roundtrips += 1
-        compat.progress(ui, _("comparing with other"), totalnb - len(undecided),
-                        total=totalnb, unit=_("changesets"))
-        ui.debug("query %i; still undecided: %i, sample size is: %i\n"
-                 % (roundtrips, len(undecided), len(sample)))
-        # indices between sample and externalized version must match
-        sample = list(sample)
-        remotehash = getremotehash(dag.externalizeall(sample))
-
-        yesno = [localhash[ix][1] == remotehash[si]
-                 for si, ix in enumerate(sample)]
-
-        commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
-        common.update(dag.ancestorset(commoninsample, common))
-
-        missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
-        missing.update(dag.descendantset(missinginsample, missing))
-
-        undecided.difference_update(missing)
-        undecided.difference_update(common)
-
-    compat.progress(ui, _("comparing with other"), None)
-    result = dag.headsetofconnecteds(common)
-    ui.debug("%d total queries\n" % roundtrips)
-
-    if not result:
-        return set([node.nullid])
-    return dag.externalizeall(result)
-
 def findmissingrange(ui, local, remote, probeset,
                      initialsamplesize=100,
                      fullsamplesize=200):
@@ -824,161 +741,6 @@
         return _obshashrange_capabilities(oldcap, repo, proto)
     wireprotov1server.commands['capabilities'] = (newcap, args)
 
-#############################
-### Tree Hash computation ###
-#############################
-
-# Dash computed from a given changesets using all markers relevant to it and
-# the obshash of its parents.  This is similar to what happend for changeset
-# node where the parent is used in the computation
-
-def _canobshashtree(repo, remote):
-    return remote.capable('_evoext_obshash_0')
-
-@eh.command(
-    'debugobsrelsethashtree',
-    [('', 'v0', None, 'hash on marker format "0"'),
-     ('', 'v1', None, 'hash on marker format "1" (default)')], _(''))
-def debugobsrelsethashtree(ui, repo, v0=False, v1=False):
-    """display Obsolete markers, Relevant Set, Hash Tree
-    changeset-node obsrelsethashtree-node
-
-    It computed form the "orsht" of its parent and markers
-    relevant to the changeset itself."""
-    if v0 and v1:
-        raise error.Abort('cannot only specify one format')
-    elif v0:
-        treefunc = _obsrelsethashtreefm0
-    else:
-        treefunc = _obsrelsethashtreefm1
-
-    for chg, obs in treefunc(repo):
-        ui.status('%s %s\n' % (node.hex(chg), node.hex(obs)))
-
-def _obsrelsethashtreefm0(repo):
-    return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker)
-
-def _obsrelsethashtreefm1(repo):
-    return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker)
-
-def _obsrelsethashtree(repo, encodeonemarker):
-    cache = []
-    unfi = repo.unfiltered()
-    markercache = {}
-    compat.progress(repo.ui, _("preparing locally"), 0, total=len(unfi),
-                    unit=_("changesets"))
-    for i in unfi:
-        ctx = unfi[i]
-        entry = 0
-        sha = hashlib.sha1()
-        # add data from p1
-        for p in ctx.parents():
-            p = p.rev()
-            if p < 0:
-                p = node.nullid
-            else:
-                p = cache[p][1]
-            if p != node.nullid:
-                entry += 1
-                sha.update(p)
-        tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
-        if tmarkers:
-            bmarkers = []
-            for m in tmarkers:
-                if m not in markercache:
-                    markercache[m] = encodeonemarker(m)
-                bmarkers.append(markercache[m])
-            bmarkers.sort()
-            for m in bmarkers:
-                entry += 1
-                sha.update(m)
-        if entry:
-            cache.append((ctx.node(), sha.digest()))
-        else:
-            cache.append((ctx.node(), node.nullid))
-        compat.progress(repo.ui, _("preparing locally"), i, total=len(unfi),
-                        unit=_("changesets"))
-    compat.progress(repo.ui, _("preparing locally"), None)
-    return cache
-
-def _obshash(repo, nodes, version=0):
-    if version == 0:
-        hashs = _obsrelsethashtreefm0(repo)
-    elif version == 1:
-        hashs = _obsrelsethashtreefm1(repo)
-    else:
-        assert False
-    nm = repo.changelog.nodemap
-    revs = [nm.get(n) for n in nodes]
-    return [r is None and node.nullid or hashs[r][1] for r in revs]
-
-@eh.addattr(localrepo.localpeer, 'evoext_obshash')
-def local_obshash(peer, nodes):
-    return _obshash(peer._repo, nodes)
-
-@eh.addattr(localrepo.localpeer, 'evoext_obshash1')
-def local_obshash1(peer, nodes):
-    return _obshash(peer._repo, nodes, version=1)
-
-@eh.addattr(wirepeer, 'evoext_obshash')
-def peer_obshash(self, nodes):
-    d = self._call("evoext_obshash", nodes=encodelist(nodes))
-    try:
-        return decodelist(d)
-    except ValueError:
-        self._abort(error.ResponseError(_("unexpected response:"), d))
-
-@eh.addattr(wirepeer, 'evoext_obshash1')
-def peer_obshash1(self, nodes):
-    d = self._call("evoext_obshash1", nodes=encodelist(nodes))
-    try:
-        return decodelist(d)
-    except ValueError:
-        self._abort(error.ResponseError(_("unexpected response:"), d))
-
-@compat.wireprotocommand(eh, 'evoext_obshash', 'nodes')
-def srv_obshash(repo, proto, nodes):
-    return encodelist(_obshash(repo, decodelist(nodes)))
-
-@compat.wireprotocommand(eh, 'evoext_obshash1', 'nodes')
-def srv_obshash1(repo, proto, nodes):
-    return encodelist(_obshash(repo, decodelist(nodes),
-                      version=1))
-
-def _obshash_capabilities(orig, repo, proto):
-    """wrapper to advertise new capability"""
-    caps = orig(repo, proto)
-    if (obsolete.isenabled(repo, obsolete.exchangeopt)
-        and repo.ui.configbool('experimental', 'evolution.obsdiscovery')):
-
-        # Compat hg 4.6+ (2f7290555c96)
-        bytesresponse = False
-        if util.safehasattr(caps, 'data'):
-            bytesresponse = True
-            caps = caps.data
-
-        caps = caps.split()
-        caps.append(b'_evoext_obshash_0')
-        caps.append(b'_evoext_obshash_1')
-        caps.sort()
-        caps = b' '.join(caps)
-
-        # Compat hg 4.6+ (2f7290555c96)
-        if bytesresponse:
-            caps = wireprototypes.bytesresponse(caps)
-    return caps
-
-@eh.extsetup
-def obshash_extsetup(ui):
-    extensions.wrapfunction(wireprotov1server, 'capabilities',
-                            _obshash_capabilities)
-    # wrap command content
-    oldcap, args = wireprotov1server.commands['capabilities']
-
-    def newcap(repo, proto):
-        return _obshash_capabilities(oldcap, repo, proto)
-    wireprotov1server.commands['capabilities'] = (newcap, args)
-
 ##########################################
 ###  trigger discovery during exchange ###
 ##########################################
@@ -998,19 +760,10 @@
     missing += pushop.outgoing.missing
     return missing
 
-def _pushobshashtree(pushop, commonrevs):
-    repo = pushop.repo.unfiltered()
-    remote = pushop.remote
-    node = repo.changelog.node
-    common = findcommonobsmarkers(pushop.ui, repo, remote, commonrevs)
-    revs = list(repo.revs('only(%ln, %ln)', pushop.futureheads, common))
-    return [node(r) for r in revs]
-
 # available discovery method, first valid is used
 # tuple (canuse, perform discovery))
 obsdiscoveries = [
     (_canobshashrange, _pushobshashrange),
-    (_canobshashtree, _pushobshashtree),
 ]
 
 obsdiscovery_skip_message = """\
@@ -1094,10 +847,6 @@
                   % len(revs))
         boundaries['missing'] = findmissingrange(repo.ui, unfi, pullop.remote,
                                                  revs)
-    elif remote.capable('_evoext_obshash_0'):
-        obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
-                           % len(revs))
-        boundaries['common'] = findcommonobsmarkers(repo.ui, unfi, remote, revs)
     else:
         boundaries['common'] = [node.nullid]
     return boundaries
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext3rd/evolve/obshashtree.py	Wed Jun 05 17:46:06 2019 +0200
@@ -0,0 +1,98 @@
+#############################
+### Tree Hash computation ###
+#############################
+
+# Status: dropable
+#
+# This module don't need to be upstreamed and can be dropped if its maintenance
+# become a burden
+
+import hashlib
+
+from mercurial import (
+    error,
+    node,
+    obsolete,
+)
+
+from mercurial.i18n import _
+
+from . import (
+    compat,
+    exthelper,
+)
+
+eh = exthelper.exthelper()
+
+# Dash computed from a given changesets using all markers relevant to it and
+# the obshash of its parents.  This is similar to what happend for changeset
+# node where the parent is used in the computation
+@eh.command(
+    'debugobsrelsethashtree',
+    [('', 'v0', None, 'hash on marker format "0"'),
+     ('', 'v1', None, 'hash on marker format "1" (default)')], _(''))
+def debugobsrelsethashtree(ui, repo, v0=False, v1=False):
+    """display Obsolete markers, Relevant Set, Hash Tree
+    changeset-node obsrelsethashtree-node
+
+    It computed form the "obs-hash-tree" value of its parent and markers
+    relevant to the changeset itself.
+
+    The obs-hash-tree is no longer used for any user facing logic. However the
+    debug command stayed as an inspection tool. It does not seem supseful to
+    upstream the command with the rest of evolve. We can safely drop it."""
+    if v0 and v1:
+        raise error.Abort('cannot only specify one format')
+    elif v0:
+        treefunc = _obsrelsethashtreefm0
+    else:
+        treefunc = _obsrelsethashtreefm1
+
+    for chg, obs in treefunc(repo):
+        ui.status('%s %s\n' % (node.hex(chg), node.hex(obs)))
+
+def _obsrelsethashtreefm0(repo):
+    return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker)
+
+def _obsrelsethashtreefm1(repo):
+    return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker)
+
+def _obsrelsethashtree(repo, encodeonemarker):
+    cache = []
+    unfi = repo.unfiltered()
+    markercache = {}
+    compat.progress(repo.ui, _("preparing locally"), 0, total=len(unfi),
+                    unit=_("changesets"))
+    for i in unfi:
+        ctx = unfi[i]
+        entry = 0
+        sha = hashlib.sha1()
+        # add data from p1
+        for p in ctx.parents():
+            p = p.rev()
+            if p < 0:
+                p = node.nullid
+            else:
+                p = cache[p][1]
+            if p != node.nullid:
+                entry += 1
+                sha.update(p)
+        tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
+        if tmarkers:
+            bmarkers = []
+            for m in tmarkers:
+                if m not in markercache:
+                    markercache[m] = encodeonemarker(m)
+                bmarkers.append(markercache[m])
+            bmarkers.sort()
+            for m in bmarkers:
+                entry += 1
+                sha.update(m)
+        if entry:
+            cache.append((ctx.node(), sha.digest()))
+        else:
+            cache.append((ctx.node(), node.nullid))
+        compat.progress(repo.ui, _("preparing locally"), i, total=len(unfi),
+                        unit=_("changesets"))
+    compat.progress(repo.ui, _("preparing locally"), None)
+    return cache
--- a/hgext3rd/evolve/rewind.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/evolve/rewind.py	Wed Jun 05 17:46:06 2019 +0200
@@ -136,7 +136,7 @@
         rewinded.update(scmutil.revrange(repo, revsto))
     if revsfrom:
         succs = scmutil.revrange(repo, revsfrom)
-        rewinded.update(unfi.revs('precursors(%ld)', succs))
+        rewinded.update(unfi.revs('predecessors(%ld)', succs))
 
     if not rewinded:
         raise error.Abort('no revision to rewind to')
--- a/hgext3rd/evolve/templatekw.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/evolve/templatekw.py	Wed Jun 05 17:46:06 2019 +0200
@@ -24,29 +24,61 @@
 ### template keywords
 
 if util.safehasattr(templatekw, 'compatlist'):
+    @eh.templatekeyword('instabilities', requires=set(['ctx', 'templ']))
+    def showinstabilities(context, mapping):
+        """List of strings. Evolution instabilities affecting the changeset
+        (zero or more of "orphan", "content-divergent" or "phase-divergent")."""
+        ctx = context.resource(mapping, 'ctx')
+        return templatekw.compatlist(context, mapping, 'instability',
+                                     ctx.instabilities(),
+                                     plural='instabilities')
+
     @eh.templatekeyword('troubles', requires=set(['ctx', 'templ']))
-    def showtroubles(context, mapping):
+    def showtroubles(context, mapping):   # legacy name for instabilities
         ctx = context.resource(mapping, 'ctx')
         return templatekw.compatlist(context, mapping, 'trouble',
                                      ctx.instabilities(), plural='troubles')
 else:
     # older template API in hg < 4.6
+    @eh.templatekeyword('instabilities')
+    def showinstabilities(**args):
+        """List of strings. Evolution instabilities affecting the changeset
+        (zero or more of "orphan", "content-divergent" or "phase-divergent")."""
+        ctx = args['ctx']
+        return templatekw.showlist('instability', ctx.instabilities(), args,
+                                   plural='instabilities')
+
     @eh.templatekeyword('troubles')
     def showtroubles(**args):
-        """List of strings. Evolution troubles affecting the changeset
-        (zero or more of "unstable", "divergent" or "bumped")."""
         ctx = args['ctx']
         return templatekw.showlist('trouble', ctx.instabilities(), args,
                                    plural='troubles')
 
-templatekw.keywords["precursors"] = templatekw.showpredecessors
+_sp = templatekw.showpredecessors
+if util.safehasattr(_sp, '_requires'):
+    def showprecursors(context, mapping):
+        return _sp(context, mapping)
+    showprecursors.__doc__ = _sp._origdoc
+    _tk = templatekw.templatekeyword("precursors", requires=_sp._requires)
+    _tk(showprecursors)
+else:
+    templatekw.keywords["precursors"] = _sp
+
 
 def closestsuccessors(repo, nodeid):
     """ returns the closest visible successors sets instead.
     """
     return directsuccessorssets(repo, nodeid)
 
-templatekw.keywords["successors"] = templatekw.showsuccessorssets
+_ss = templatekw.showsuccessorssets
+if util.safehasattr(_ss, '_requires'):
+    def showsuccessors(context, mapping):
+        return _ss(context, mapping)
+    showsuccessors.__doc__ = _ss._origdoc
+    _tk = templatekw.templatekeyword("successors", requires=_ss._requires)
+    _tk(showsuccessors)
+else:
+    templatekw.keywords["successors"] = _ss
 
 def _getusername(ui):
     """the default username in the config or None"""
--- a/hgext3rd/evolve/utility.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/evolve/utility.py	Wed Jun 05 17:46:06 2019 +0200
@@ -187,3 +187,26 @@
         return None
 
     return revs[intidx - 1]
+
+def mergeusers(ui, base, divergent, other):
+    """ merges the users from two divergent changesets using three-way merge
+    and return the user that will be used as the author of resolved cset"""
+    baseuser = base.user()
+    divuser = divergent.user()
+    othuser = other.user()
+
+    if divuser == othuser:
+        return divuser
+    else:
+        if baseuser == divuser:
+            return othuser
+        elif baseuser == othuser:
+            return divuser
+        else:
+            # all three are different, lets concatenate the two authors
+            # XXX: should we let the user know about concatenation of authors
+            #      by printing some message (or maybe in verbose mode)
+            users = set(divuser.split(', '))
+            users.update(othuser.split(', '))
+            user = ', '.join(sorted(users))
+            return user
--- a/hgext3rd/topic/__init__.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/topic/__init__.py	Wed Jun 05 17:46:06 2019 +0200
@@ -104,6 +104,12 @@
 In addition, the topic extension adds a ``--publish`` flag on :hg:`push`. When
 used, the pushed revisions are published if the push succeeds. It also applies
 to common revisions selected by the push.
+
+One can prevent any publishing to happens in a repository using::
+
+    [experimental]
+    topic.allow-publish = no
+
 """
 
 from __future__ import absolute_import
@@ -154,36 +160,36 @@
 cmdtable = {}
 command = registrar.command(cmdtable)
 colortable = {'topic.active': 'green',
-              'topic.list.troubledcount': 'red',
+              'topic.list.unstablecount': 'red',
               'topic.list.headcount.multiple': 'yellow',
               'topic.list.behindcount': 'cyan',
               'topic.list.behinderror': 'red',
-              'topic.stack.index': 'yellow',
-              'topic.stack.index.base': 'none dim',
-              'topic.stack.desc.base': 'none dim',
-              'topic.stack.shortnode.base': 'none dim',
-              'topic.stack.state.base': 'dim',
-              'topic.stack.state.clean': 'green',
-              'topic.stack.index.current': 'cyan',       # random pick
-              'topic.stack.state.current': 'cyan bold',  # random pick
-              'topic.stack.desc.current': 'cyan',        # random pick
-              'topic.stack.shortnode.current': 'cyan',   # random pick
-              'topic.stack.state.orphan': 'red',
-              'topic.stack.state.content-divergent': 'red',
-              'topic.stack.state.phase-divergent': 'red',
-              'topic.stack.summary.behindcount': 'cyan',
-              'topic.stack.summary.behinderror': 'red',
-              'topic.stack.summary.headcount.multiple': 'yellow',
+              'stack.index': 'yellow',
+              'stack.index.base': 'none dim',
+              'stack.desc.base': 'none dim',
+              'stack.shortnode.base': 'none dim',
+              'stack.state.base': 'dim',
+              'stack.state.clean': 'green',
+              'stack.index.current': 'cyan',       # random pick
+              'stack.state.current': 'cyan bold',  # random pick
+              'stack.desc.current': 'cyan',        # random pick
+              'stack.shortnode.current': 'cyan',   # random pick
+              'stack.state.orphan': 'red',
+              'stack.state.content-divergent': 'red',
+              'stack.state.phase-divergent': 'red',
+              'stack.summary.behindcount': 'cyan',
+              'stack.summary.behinderror': 'red',
+              'stack.summary.headcount.multiple': 'yellow',
               # default color to help log output and thg
               # (first pick I could think off, update as needed
               'log.topic': 'green_background',
               'topic.active': 'green',
              }
 
-__version__ = '0.14.1.dev'
+__version__ = '0.15.0.dev'
 
-testedwith = '4.4.2 4.5.2 4.6.2 4.7 4.8 4.9 5.0'
-minimumhgversion = '4.4'
+testedwith = '4.5.2 4.6.2 4.7 4.8 4.9 5.0'
+minimumhgversion = '4.5'
 buglink = 'https://bz.mercurial-scm.org/'
 
 if util.safehasattr(registrar, 'configitem'):
@@ -205,6 +211,9 @@
     configitem('experimental', 'topic.publish-bare-branch',
                default=False,
     )
+    configitem('experimental', 'topic.allow-publish',
+               default=configitems.dynamicdefault,
+    )
     configitem('_internal', 'keep-topic',
                default=False,
     )
@@ -256,7 +265,6 @@
 
 stackrev = re.compile(r'^s\d+$')
 topicrev = re.compile(r'^t\d+$')
-branchrev = re.compile(r'^b\d+$')
 
 hastopicext = common.hastopicext
 
@@ -279,11 +287,6 @@
         if not tname:
             raise error.Abort(_('cannot resolve "%s": no active topic') % name)
         revs = list(stack.stack(repo, topic=topic))
-    elif branchrev.match(name):
-        ttype = 'branch'
-        idx = int(name[1:])
-        tname = branch = repo[None].branch()
-        revs = list(stack.stack(repo, branch=branch))
 
     if revs is not None:
         try:
@@ -294,7 +297,7 @@
             elif ttype == 'branch':
                 msg = _('cannot resolve "%s": %s "%s" has only %d non-public changesets')
             raise error.Abort(msg % (name, ttype, tname, len(revs) - 1))
-        # b0 or t0 or s0 can be None
+        # t0 or s0 can be None
         if r == -1 and idx == 0:
             msg = _('the %s "%s" has no %s')
             raise error.Abort(msg % (ttype, tname, name))
@@ -502,6 +505,23 @@
                     flow.publishbarebranch(repo, tr2)
                     origclose()
                 tr.close = close
+            allow_publish = self.ui.configbool('experimental',
+                                               'topic.allow-publish',
+                                               True)
+            if not allow_publish:
+                if util.safehasattr(tr, 'validator'): # hg <= 4.7
+                    origvalidator = tr.validator
+                else:
+                    origvalidator = tr._validator
+
+                def validator(tr2):
+                    repo = reporef()
+                    flow.reject_publish(repo, tr2)
+                    return origvalidator(tr2)
+                if util.safehasattr(tr, 'validator'): # hg <= 4.7
+                    tr.validator = validator
+                else:
+                    tr._validator = validator
 
             # real transaction start
             ct = self.currenttopic
@@ -575,7 +595,8 @@
             self._extra[constants.extrakey] = ''
 
 def wrapadd(orig, cl, manifest, files, desc, transaction, p1, p2, user,
-            date=None, extra=None, p1copies=None, p2copies=None):
+            date=None, extra=None, p1copies=None, p2copies=None,
+            filesadded=None, filesremoved=None):
     if constants.extrakey in extra and not extra[constants.extrakey]:
         extra = extra.copy()
         del extra[constants.extrakey]
@@ -585,6 +606,11 @@
         kwargs['p1copies'] = p1copies
     if p2copies is not None:
         kwargs['p2copies'] = p2copies
+    # hg <= 5.0 (f385ba70e4af)
+    if filesadded is not None:
+        kwargs['filesadded'] = filesadded
+    if filesremoved is not None:
+        kwargs['filesremoved'] = filesremoved
     return orig(cl, manifest, files, desc, transaction, p1, p2, user,
                 date=date, extra=extra, **kwargs)
 
@@ -709,8 +735,8 @@
     ct = repo.currenttopic
     if clear:
         if ct:
-            empty = stack.stack(repo, topic=ct).changesetcount == 0
-            if empty:
+            st = stack.stack(repo, topic=ct)
+            if not st:
                 ui.status(_('clearing empty topic "%s"\n') % ct)
         return _changecurrenttopic(repo, None)
 
@@ -1024,11 +1050,11 @@
         fm.write('changesetcount', '%d changesets', data.changesetcount,
                  label='topic.list.changesetcount')
 
-        if data.troubledcount:
+        if data.unstablecount:
             fm.plain(', ')
-            fm.write('troubledcount', '%d troubled',
-                     data.troubledcount,
-                     label='topic.list.troubledcount')
+            fm.write('unstablecount', '%d unstable',
+                     data.unstablecount,
+                     label='topic.list.unstablecount')
 
         headcount = len(data.heads)
         if 1 < headcount:
@@ -1208,8 +1234,8 @@
             if t and t != ot:
                 repo.ui.status(_("switching to topic %s\n") % t)
             if ot and not t:
-                empty = stack.stack(repo, topic=ot).changesetcount == 0
-                if empty:
+                st = stack.stack(repo, topic=ot)
+                if not st:
                     repo.ui.status(_('clearing empty topic "%s"\n') % ot)
         elif ist0:
             repo.ui.status(_("preserving the current topic '%s'\n") % ot)
--- a/hgext3rd/topic/flow.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/topic/flow.py	Wed Jun 05 17:46:06 2019 +0200
@@ -55,6 +55,19 @@
         else:
             repo.ui.warn(_("unknown 'topic-mode.server': %s\n" % mode))
 
+def reject_publish(repo, tr):
+    """prevent a transaction to be publish anything"""
+    published = set()
+    for r, (o, n) in tr.changes['phases'].items():
+        if n == phases.public:
+            published.add(r)
+    if published:
+        r = min(published)
+        msg = "rejecting publishing of changeset %s" % repo[r]
+        if len(published) > 1:
+            msg += ' and %d others' % (len(published) - 1)
+        raise error.Abort(msg)
+
 def wrappush(orig, repo, remote, *args, **kwargs):
     """interpret the --publish flag and pass it to the push operation"""
     newargs = kwargs.copy()
--- a/hgext3rd/topic/stack.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/topic/stack.py	Wed Jun 05 17:46:06 2019 +0200
@@ -77,6 +77,11 @@
     def __getitem__(self, index):
         return self.revs[index]
 
+    def __nonzero__(self):
+        return bool(self._revs)
+
+    __bool__ = __nonzero__
+
     def index(self, item):
         return self.revs.index(item)
 
@@ -175,7 +180,7 @@
         return len(self._revs)
 
     @util.propertycache
-    def troubledcount(self):
+    def unstablecount(self):
         return len([r for r in self._revs if self._repo[r].isunstable()])
 
     @util.propertycache
@@ -210,11 +215,9 @@
             branches = set([self._repo[None].branch()])
         return branches
 
-def labelsgen(prefix, labelssuffix):
-    """ Takes a label prefix and a list of suffixes. Returns a string of the prefix
-    formatted with each suffix separated with a space.
-    """
-    return ' '.join(prefix % suffix.replace(' ', '-') for suffix in labelssuffix)
+def labelsgen(prefix, parts):
+    fmt = prefix + '.%s'
+    return prefix + ' ' + ' '.join(fmt % p.replace(' ', '-') for p in parts)
 
 def showstack(ui, repo, branch=None, topic=None, opts=None):
     if opts is None:
@@ -242,41 +245,38 @@
     if topic == repo.currenttopic:
         label = 'topic.active'
 
-    data = stackdata(repo, branch=branch, topic=topic)
-    empty = False
-    if data['changesetcount'] == 0:
-        empty = True
+    st = stack(repo, branch, topic)
     if topic is not None:
         fm.plain(_('### topic: %s')
                  % ui.label(topic, label),
-                 label='topic.stack.summary.topic')
+                 label='stack.summary.topic')
 
-        if 1 < data['headcount']:
+        if 1 < len(st.heads):
             fm.plain(' (')
-            fm.plain('%d heads' % data['headcount'],
-                     label='topic.stack.summary.headcount.multiple')
+            fm.plain('%d heads' % len(st.heads),
+                     label='stack.summary.headcount.multiple')
             fm.plain(')')
         fm.plain('\n')
     fm.plain(_('### target: %s (branch)')
-             % '+'.join(data['branches']), # XXX handle multi branches
-             label='topic.stack.summary.branches')
+             % '+'.join(st.branches), # XXX handle multi branches
+             label='stack.summary.branches')
     if topic is None:
-        if 1 < data['headcount']:
+        if 1 < len(st.heads):
             fm.plain(' (')
-            fm.plain('%d heads' % data['headcount'],
-                     label='topic.stack.summary.headcount.multiple')
+            fm.plain('%d heads' % len(st.heads),
+                     label='stack.summary.headcount.multiple')
             fm.plain(')')
     else:
-        if data['behindcount'] == -1:
+        if st.behindcount == -1:
             fm.plain(', ')
-            fm.plain('ambiguous rebase destination - %s' % data['behinderror'],
-                     label='topic.stack.summary.behinderror')
-        elif data['behindcount']:
+            fm.plain('ambiguous rebase destination - %s' % st.behinderror,
+                     label='stack.summary.behinderror')
+        elif st.behindcount:
             fm.plain(', ')
-            fm.plain('%d behind' % data['behindcount'], label='topic.stack.summary.behindcount')
+            fm.plain('%d behind' % st.behindcount, label='stack.summary.behindcount')
     fm.plain('\n')
 
-    if empty:
+    if not st:
         fm.plain(_("(stack is empty)\n"))
 
     st = stack(repo, branch=branch, topic=topic)
@@ -318,7 +318,7 @@
         states = []
         if opts.get('children'):
             expr = 'children(%d) and merge() - %ld'
-            revisions = repo.revs(expr, ctx.rev(), st.revs[1:])
+            revisions = repo.revs(expr, ctx.rev(), st._revs)
             if len(revisions) > 0:
                 states.append('external-children')
 
@@ -354,43 +354,35 @@
         states.sort()
 
         fm.startitem()
+        fm.context(ctx=ctx)
         fm.data(isentry=isentry)
 
         if idx is None:
-            fm.plain('  ')
-            if ui.verbose:
-                fm.plain('              ')
-        else:
-            fm.write('topic.stack.index', '%s%%d' % prefix, idx,
-                     label='topic.stack.index ' + labelsgen('topic.stack.index.%s', states))
+            spacewidth = 0
             if ui.verbose:
-                fm.write('topic.stack.shortnode', '(%s)', short(ctx.node()),
-                         label='topic.stack.shortnode ' + labelsgen('topic.stack.shortnode.%s', states))
-        fm.write('topic.stack.state.symbol', '%s', symbol,
-                 label='topic.stack.state ' + labelsgen('topic.stack.state.%s', states))
+                # parentheses plus short node hash
+                spacewidth = 2 + 12
+            if ui.debugflag:
+                # parentheses plus full node hash
+                spacewidth = 2 + 40
+            # s# alias width
+            spacewidth += 2
+            fm.plain(' ' * spacewidth)
+        else:
+            fm.write('stack_index', '%s%%d' % prefix, idx,
+                     label=labelsgen('stack.index', states))
+            if ui.verbose:
+                fm.write('node', '(%s)', fm.hexfunc(ctx.node()),
+                         label=labelsgen('stack.shortnode', states))
+            else:
+                fm.data(node=fm.hexfunc(ctx.node()))
+        fm.write('symbol', '%s', symbol,
+                 label=labelsgen('stack.state', states))
         fm.plain(' ')
-        fm.write('topic.stack.desc', '%s', ctx.description().splitlines()[0],
-                 label='topic.stack.desc ' + labelsgen('topic.stack.desc.%s', states))
-        fm.condwrite(states != ['clean'] and idx is not None, 'topic.stack.state',
-                     ' (%s)', fm.formatlist(states, 'topic.stack.state'),
-                     label='topic.stack.state ' + labelsgen('topic.stack.state.%s', states))
+        fm.write('desc', '%s', ctx.description().splitlines()[0],
+                 label=labelsgen('stack.desc', states))
+        fm.condwrite(states != ['clean'] and idx is not None, 'state',
+                     ' (%s)', fm.formatlist(states, 'stack.state'),
+                     label=labelsgen('stack.state', states))
         fm.plain('\n')
     fm.end()
-
-def stackdata(repo, branch=None, topic=None):
-    """get various data about a stack
-
-    :changesetcount: number of non-obsolete changesets in the stack
-    :troubledcount: number on troubled changesets
-    :headcount: number of heads on the topic
-    :behindcount: number of changeset on rebase destination
-    """
-    data = {}
-    current = stack(repo, branch, topic)
-    data['changesetcount'] = current.changesetcount
-    data['troubledcount'] = current.troubledcount
-    data['headcount'] = len(current.heads)
-    data['behindcount'] = current.behindcount
-    data['behinderror'] = current.behinderror
-    data['branches'] = current.branches
-    return data
--- a/hgext3rd/topic/topicmap.py	Tue Apr 23 14:18:11 2019 +0200
+++ b/hgext3rd/topic/topicmap.py	Wed Jun 05 17:46:06 2019 +0200
@@ -108,7 +108,6 @@
     # logic copy-pasted from cmdutil.commitstatus()
     if opts is None:
         opts = {}
-    ctx = repo[node]
     if ctx.topic():
         return ret
     parents = ctx.parents()
--- a/tests/test-discovery-obshashrange.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-discovery-obshashrange.t	Wed Jun 05 17:46:06 2019 +0200
@@ -191,7 +191,7 @@
   sending hello command
   sending between command
   remote: * (glob)
-  remote: capabilities: _evoext_getbundle_obscommon _evoext_obshash_0 _evoext_obshash_1 _evoext_obshashrange_v1 batch * (glob)
+  remote: capabilities: _evoext_getbundle_obscommon _evoext_obshashrange_v1 batch * (glob)
   remote: 1
   query 1; heads
   sending batch command
@@ -319,7 +319,7 @@
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> sending hello command (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> sending between command (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> remote: * (glob)
-  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> remote: capabilities: _evoext_getbundle_obscommon _evoext_obshash_0 _evoext_obshash_1 _evoext_obshashrange_v1 batch branchmap bundle2=HG20%0Abookmarks%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Aerror%3Dabort%2Cunsupportedcontent%2Cpushraced%2Cpushkey%0Ahgtagsfnodes%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Aphases%3Dheads%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps changegroupsubset getbundle known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> remote: capabilities: _evoext_getbundle_obscommon _evoext_obshashrange_v1 batch branchmap bundle2=HG20%0Abookmarks%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Aerror%3Dabort%2Cunsupportedcontent%2Cpushraced%2Cpushkey%0Ahgtagsfnodes%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Aphases%3Dheads%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps changegroupsubset getbundle known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> remote: 1 (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> query 1; heads (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> sending batch command (glob)
@@ -1174,8 +1174,6 @@
 
   $ hg debugcapabilities ssh://user@dummy/with-evolve | grep _evoext
     _evoext_getbundle_obscommon
-    _evoext_obshash_0
-    _evoext_obshash_1
     _evoext_obshashrange_v1
   $ hg debugcapabilities ssh://user@dummy/without-evolve | grep _evoext
   [1]
@@ -1194,8 +1192,6 @@
 
   $ hg debugcapabilities http://localhost:$HGPORT/with-evolve| grep _evoext
     _evoext_getbundle_obscommon
-    _evoext_obshash_0
-    _evoext_obshash_1
     _evoext_obshashrange_v1
   $ hg debugcapabilities http://localhost:$HGPORT/without-evolve| grep _evoext
   [1]
@@ -1212,8 +1208,6 @@
   [1]
   $ hg debugcapabilities http://localhost:$HGPORT/with-evolve| grep _evoext
     _evoext_getbundle_obscommon
-    _evoext_obshash_0
-    _evoext_obshash_1
     _evoext_obshashrange_v1
 
   $ killdaemons.py
--- a/tests/test-evolve-abort-orphan.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-abort-orphan.t	Wed Jun 05 17:46:06 2019 +0200
@@ -127,7 +127,7 @@
 
 cleaning up things for next testing
 
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[4] added d
   atop:[5] added c
   merging d
@@ -526,7 +526,7 @@
   $ hg next --evolve
   move:[2] added b
   atop:[4] added a
-  working directory now at c1f4718020e3
+  working directory is now at c1f4718020e3
   $ hg next --evolve
   move:[3] added c
   atop:[5] added b
--- a/tests/test-evolve-content-divergent-basic.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-content-divergent-basic.t	Wed Jun 05 17:46:06 2019 +0200
@@ -20,7 +20,7 @@
   > git = 1
   > unified = 0
   > [ui]
-  > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline} [{troubles}]\n
+  > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline} [{instabilities}]\n
   > [extensions]
   > EOF
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
@@ -139,8 +139,6 @@
   merge:[2] divergent
   with: [3] divergent
   base: [1] added b
-  updating to "local" side of the conflict: 593c57f2117e
-  merging "other" content-divergent changeset '8374d2ddc3a4'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at 45bf1312f454
   $ hg log -G
@@ -231,13 +229,12 @@
   o  0:8fa14d15e168 added hgignore
       () [default] draft
 
-  $ hg evolve --content-divergent --config ui.interactive=True<<EOF
+  $ hg evolve --content-divergent --no-all --config ui.interactive=True << EOF
   > c
   > EOF
   merge:[6] added d
   with: [5] added d
   base: [4] added d
-  merging "other" content-divergent changeset '9e5dffcb3d48'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   content divergent changesets on different branches.
   choose branch for the resolution changeset. (a) default or (b) watwat or (c) foobar?  c
@@ -288,11 +285,10 @@
   o  0:8fa14d15e168 added hgignore
       () [default] draft
 
-  $ hg evolve --content-divergent
+  $ hg evolve --content-divergent --no-all
   merge:[9] added a d with bar in it, expect some beers
   with: [8] added d
   base: [7] added d
-  merging "other" content-divergent changeset 'f621d00f5f0e'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at a9d6fd6b5e40
 
@@ -337,11 +333,10 @@
   o  0:8fa14d15e168 added hgignore
       () [default] draft
 
-  $ hg evolve --content-divergent
+  $ hg evolve --content-divergent --no-all
   merge:[12] foo to d
   with: [11] foo to d
   base: [10] added a d with bar in it, expect some beers
-  merging "other" content-divergent changeset 'b10b07a394f1'
   merging d
   warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -397,11 +392,10 @@
   o  0:8fa14d15e168 added hgignore
       () [default] draft
 
-  $ hg evolve --content-divergent
+  $ hg evolve --content-divergent --no-all
   merge:[15] wat to d, wat?
   with: [14] bar to d, expect beers
   base: [13] foo to d
-  merging "other" content-divergent changeset '27f0463f169a'
   merging d
   warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -505,14 +499,14 @@
 
 Stabilize it
 
-  $ hg evolve -qn --confirm --content-divergent
+  $ hg evolve -qn --confirm --content-divergent --no-all
   merge:[3] More addition
   with: [2] More addition
   base: [1] More addition
   perform evolve? [Ny] n
   abort: evolve aborted by user
   [255]
-  $ echo y | hg evolve -qn --confirm --config ui.interactive=True --content-divergent
+  $ echo y | hg evolve -qn --confirm --config ui.interactive=True --content-divergent --no-all
   merge:[3] More addition
   with: [2] More addition
   base: [1] More addition
@@ -523,7 +517,7 @@
   hg up -C 867e43582046 &&
   hg revert --all --rev tip &&
   hg commit -m "`hg log -r 051337a45e7c --template={desc}`";
-  $ hg evolve -v --content-divergent
+  $ hg evolve -v --content-divergent --no-all
   merge:[3] More addition
   with: [2] More addition
   base: [1] More addition
@@ -601,18 +595,17 @@
   o  0:6569b5a81c7e@default(public) bk:[] root
   
 
-  $ hg evolve -qn --content-divergent
+  $ hg evolve -qn --content-divergent --no-all
   hg update -c 13c1b75640a1 &&
   hg merge 5bf84d1d71d1 &&
   hg commit -m "auto merge resolving conflict between 13c1b75640a1 and 5bf84d1d71d1"&&
   hg up -C 867e43582046 &&
   hg revert --all --rev tip &&
   hg commit -m "`hg log -r 13c1b75640a1 --template={desc}`";
-  $ hg evolve --content-divergent
+  $ hg evolve --content-divergent --no-all
   merge:[6] More addition (2)
   with: [4] More addition
   base: [1] More addition
-  merging "other" content-divergent changeset '5bf84d1d71d1'
   merging a
   warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -960,8 +953,6 @@
   merge:[2] E2
   with: [3] E3
   base: [1] E1
-  updating to "local" side of the conflict: 084ae625fa51
-  merging "other" content-divergent changeset '19ed1bf64a2c'
   merging numbers
   merging romans
   1 files updated, 2 files merged, 0 files removed, 0 files unresolved
--- a/tests/test-evolve-content-divergent-corner-cases.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-content-divergent-corner-cases.t	Wed Jun 05 17:46:06 2019 +0200
@@ -20,7 +20,7 @@
   > git = 1
   > unified = 0
   > [ui]
-  > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline} [{troubles}]\n
+  > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline} [{instabilities}]\n
   > [extensions]
   > EOF
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
@@ -72,12 +72,10 @@
   o  0:9092f1db7931@default(draft) added a []
   
 
-  $ hg evolve --all --any --content-divergent
+  $ hg evolve --all --any --content-divergent --update
   merge:[2] divergent
   with: [3] divergent
   base: [1] added b
-  updating to "local" side of the conflict: 593c57f2117e
-  merging "other" content-divergent changeset '8374d2ddc3a4'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at 45bf1312f454
   $ hg log -G
@@ -137,8 +135,6 @@
   merge:[6] add cdivergent1
   with: [7] add _c
   base: [5] add _c
-  updating to "local" side of the conflict: e3ff64ce8d4c
-  merging "other" content-divergent changeset 'b2ae71172042'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   nothing changed
   working directory is now at e3ff64ce8d4c
@@ -199,15 +195,14 @@
   > [extensions]
   > testextension=$TESTTMP/test_extension.py
   > EOF
-  $ hg evolve --all
+  $ hg evolve
   nothing to evolve on current working copy parent
   (do you want to use --content-divergent)
   [2]
   $ hg evolve --content-divergent
-  merge:[3] bdivergent
-  with: [2] bdivergent
+  merge:[2] bdivergent
+  with: [3] bdivergent
   base: [1] add _b
-  merging "other" content-divergent changeset '05a6b6a9e633'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at 73ff357d3975
 
@@ -275,7 +270,7 @@
   o  0:9092f1db7931 added a
       () [default] draft
 
-  $ hg evolve --content-divergent --any
+  $ hg evolve --content-divergent --any --update
   merge:[5] updated e
   with: [6] updated e
   base: [4] added e
@@ -308,8 +303,6 @@
 
   $ hg evolve --continue
   evolving 6:de4ea3103326 "updated e"
-  updating to "local" side of the conflict: ff6f7cd76a7c
-  merging "other" content-divergent changeset 'e504bd82de7e'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at 83b1664a580f
 
@@ -363,11 +356,10 @@
 
 Resolve the divergence, only "a" should be removed
 
-  $ hg evolve --content-divergent
-  merge:[3] delete a
-  with: [2] delete a
+  $ hg evolve --content-divergent --update
+  merge:[2] delete a
+  with: [3] delete a
   base: [1] delete a
-  merging "other" content-divergent changeset '0825dcee2670'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at 7ca6a9fafcf6
   $ hg glog
--- a/tests/test-evolve-content-divergent-interrupted.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-content-divergent-interrupted.t	Wed Jun 05 17:46:06 2019 +0200
@@ -79,11 +79,10 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-  $ hg evolve --content-divergent
+  $ hg evolve --content-divergent --no-all
   merge:[6] added d
   with: [5] added d
   base: [4] added d
-  merging "other" content-divergent changeset 'e49523854bc8'
   merging d
   warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -191,14 +190,10 @@
   merge:[8] added c
   with: [10] added c
   base: [3] added c
-  updating to "local" side of the conflict: 2ba73e31f264
-  merging "other" content-divergent changeset '491e10505bae'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merge:[5] added d
   with: [7] added d
   base: [4] added d
-  updating to "local" side of the conflict: e49523854bc8
-  merging "other" content-divergent changeset 'f0f1694f123e'
   merging d
   warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -358,8 +353,6 @@
   with: [8] added d
   base: [4] added d
   rebasing "other" content-divergent changeset 33e4442acf98 on ca1b80f7960a
-  updating to "local" side of the conflict: e49523854bc8
-  merging "other" content-divergent changeset 'a663d1567f0b'
   merging d
   warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -447,11 +440,10 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-  $ hg evolve --content-divergent
+  $ hg evolve --content-divergent --no-all
   merge:[6] added d
   with: [5] added d
   base: [4] added d
-  merging "other" content-divergent changeset 'e49523854bc8'
   merging d
   warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -504,8 +496,6 @@
   with: [7] added d
   base: [4] added d
   rebasing "other" content-divergent changeset 517d4375cb72 on ca1b80f7960a
-  updating to "local" side of the conflict: e49523854bc8
-  merging "other" content-divergent changeset '606ad96040fc'
   merging d
   warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
--- a/tests/test-evolve-content-divergent-meta.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-content-divergent-meta.t	Wed Jun 05 17:46:06 2019 +0200
@@ -9,7 +9,7 @@
 
   $ cat >> $HGRCPATH <<EOF
   > [alias]
-  > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {troubles}\n\n"
+  > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {instabilities}\n\n"
   > [phases]
   > publish = False
   > [extensions]
@@ -86,10 +86,7 @@
   merge:[3] added c e
   with: [4] added c
   base: [2] added c
-  updating to "local" side of the conflict: 0c9267e23c9d
-  merging "other" content-divergent changeset '6c06cda6dc99'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory is now at 443bd2972210
 
 Make sure resultant cset don't replace the initial user with user running the command:
   $ hg log -r tip
@@ -100,3 +97,63 @@
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     added c e
   
+  $ cd ..
+
+Testing the three way merge logic for user of content divergent changesets
+--------------------------------------------------------------------------
+
+  $ hg init mergeusers
+  $ cd mergeusers
+  $ for ch in a b c; do
+  > touch $ch
+  > hg add $ch
+  > hg ci -m "added "$ch
+  > done;
+
+  $ hg amend -m "updated c"
+  $ hg up -r 'desc("added c")' --hidden -q
+  updating to a hidden changeset 2b3c31fe982d
+  (hidden revision '2b3c31fe982d' was rewritten as: 464e35020fd0)
+  working directory parent is obsolete! (2b3c31fe982d)
+  $ echo coco > c
+
+1) when one user is different wrt base
+--------------------------------------
+
+Insert a diverging author name:
+  $ hg amend -u 'foouser'
+  2 new content-divergent changesets
+
+Run automatic evolution:
+  $ hg evolve --content-divergent
+  merge:[3] updated c
+  with: [4] added c
+  base: [2] added c
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory is now at 932d6ceb7672
+
+  $ hg log -r tip | grep "^user"
+  user:        foouser
+
+  $ hg strip . -q --config extensions.strip=
+  2 new content-divergent changesets
+
+2) when both the user are different wrt base
+--------------------------------------------
+
+  $ hg up -r 'max(desc("updated c"))'
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg amend -u 'baruser'
+
+Run automatic evolution:
+  $ hg evolve --content-divergent
+  merge:[4] added c
+  with: [5] updated c
+  base: [2] added c
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory is now at 202a770d8c1f
+
+  $ hg log -r tip | grep "^user"
+  user:        baruser, foouser
+
+  $ cd ..
--- a/tests/test-evolve-content-divergent-relocation.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-content-divergent-relocation.t	Wed Jun 05 17:46:06 2019 +0200
@@ -68,8 +68,6 @@
   with: [6] added b
   base: [2] added b
   rebasing "other" content-divergent changeset da4b96f4a8d6 on c7586e2a9264
-  updating to "local" side of the conflict: 7ed0642d644b
-  merging "other" content-divergent changeset '11f849d7159f'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at 171614c9a791
 
@@ -108,13 +106,12 @@
   move:[3] added c
   atop:[8] added b
   move:[4] added d
-  working directory is now at 4ae4427ee9f8
   $ hg glog
-  @  10:4ae4427ee9f8 added d
+  o  10:4ae4427ee9f8 added d
   |   () [default] draft
   o  9:917281f93fcb added c
   |   () [default] draft
-  o  8:171614c9a791 added b
+  @  8:171614c9a791 added b
   |   () [default] draft
   o  1:c7586e2a9264 added a
   |   () [default] draft
@@ -123,8 +120,6 @@
 
 More testing!
 
-  $ hg up .^^
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   $ echo x > x
   $ hg ci -Aqm "added x"
   $ hg glog -r .
@@ -169,8 +164,6 @@
   with: [12] added foo to x
   base: [11] added x
   rebasing "other" content-divergent changeset 1e1a50385a7d on 4ae4427ee9f8
-  updating to "local" side of the conflict: 1e4f6b3bb39b
-  merging "other" content-divergent changeset '80cc9b1ec650'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at b006cf317e0e
 
@@ -258,8 +251,6 @@
   with: [17] added y
   base: [16] added y
   rebasing "other" content-divergent changeset 2a9f6ccbdeba on b006cf317e0e
-  updating to "local" side of the conflict: b4575ed6fcfc
-  merging "other" content-divergent changeset '48f745db3f53'
   merging y
   warning: conflicts while merging y! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -423,8 +414,6 @@
 
   $ hg evolve --continue
   evolving 23:3f7a1f693080 "added z"
-  updating to "local" side of the conflict: 53242575ffa9
-  merging "other" content-divergent changeset 'cdb0643c69fc'
   merging y
   warning: conflicts while merging y! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
--- a/tests/test-evolve-content-divergent-stack.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-content-divergent-stack.t	Wed Jun 05 17:46:06 2019 +0200
@@ -72,15 +72,14 @@
   atop:[6] watbar to a
   move:[3] added c
   move:[4] added d
-  working directory is now at 15c781f93cac
   $ hg glog
-  @  9:15c781f93cac added d
+  o  9:15c781f93cac added d
   |   () [default] draft
   o  8:9e5fb1d5b955 added c
   |   () [default] draft
   o  7:88516dccf68a added b
   |   () [default] draft
-  o  6:82b74d5dc678 watbar to a
+  @  6:82b74d5dc678 watbar to a
   |   () [default] draft
   o  0:8fa14d15e168 added hgignore
       () [default] draft
@@ -96,15 +95,14 @@
   atop:[5] watbar to a
   move:[3] added c
   move:[4] added d
-  working directory is now at c72d2885eb51
   $ hg glog
-  @  8:c72d2885eb51 added d
+  o  8:c72d2885eb51 added d
   |   () [default] draft
   o  7:3ce4be6d8e5e added c
   |   () [default] draft
   o  6:d5f148423c16 added b
   |   () [default] draft
-  o  5:8e222f257bbf watbar to a
+  @  5:8e222f257bbf watbar to a
   |   () [default] draft
   o  0:8fa14d15e168 added hgignore
       () [default] draft
@@ -130,13 +128,13 @@
   |   () [default] draft
   *  9:82b74d5dc678 watbar to a
   |   () [default] draft
-  | @  8:c72d2885eb51 added d
+  | *  8:c72d2885eb51 added d
   | |   () [default] draft
   | *  7:3ce4be6d8e5e added c
   | |   () [default] draft
   | *  6:d5f148423c16 added b
   | |   () [default] draft
-  | *  5:8e222f257bbf watbar to a
+  | @  5:8e222f257bbf watbar to a
   |/    () [default] draft
   o  0:8fa14d15e168 added hgignore
       () [default] draft
@@ -145,38 +143,29 @@
   merge:[5] watbar to a
   with: [9] watbar to a
   base: [1] added a
-  updating to "local" side of the conflict: 8e222f257bbf
-  merging "other" content-divergent changeset '82b74d5dc678'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  6 new orphan changesets
   merge:[6] added b
   with: [10] added b
   base: [2] added b
-  updating to "local" side of the conflict: d5f148423c16
-  merging "other" content-divergent changeset '88516dccf68a'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merge:[7] added c
   with: [11] added c
   base: [3] added c
-  updating to "local" side of the conflict: 3ce4be6d8e5e
-  merging "other" content-divergent changeset '9e5fb1d5b955'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merge:[8] added d
   with: [12] added d
   base: [4] added d
-  updating to "local" side of the conflict: c72d2885eb51
-  merging "other" content-divergent changeset '15c781f93cac'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory is now at 038fe7db3d88
+  working directory is now at f66f262fff6c
 
   $ hg glog
-  @  16:038fe7db3d88 added d
+  o  16:038fe7db3d88 added d
   |   () [default] draft
   o  15:b2cac10f3836 added c
   |   () [default] draft
   o  14:eadfd9d70680 added b
   |   () [default] draft
-  o  13:f66f262fff6c watbar to a
+  @  13:f66f262fff6c watbar to a
   |   () [default] draft
   o  0:8fa14d15e168 added hgignore
       () [default] draft
@@ -270,16 +259,15 @@
   atop:[5] watbar to a
   move:[3] added c
   move:[4] added d
-  working directory is now at c72d2885eb51
 
   $ hg glog
-  @  8:c72d2885eb51 added d
+  o  8:c72d2885eb51 added d
   |   () [default] draft
   o  7:3ce4be6d8e5e added c
   |   () [default] draft
   o  6:d5f148423c16 added b
   |   () [default] draft
-  o  5:8e222f257bbf watbar to a
+  @  5:8e222f257bbf watbar to a
   |   () [default] draft
   o  0:8fa14d15e168 added hgignore
       () [default] draft
@@ -307,13 +295,13 @@
   |   () [default] draft
   o  9:2228e3b74514 add newfile
   |   () [default] draft
-  | @  8:c72d2885eb51 added d
+  | *  8:c72d2885eb51 added d
   | |   () [default] draft
   | *  7:3ce4be6d8e5e added c
   | |   () [default] draft
   | *  6:d5f148423c16 added b
   | |   () [default] draft
-  | *  5:8e222f257bbf watbar to a
+  | @  5:8e222f257bbf watbar to a
   |/    () [default] draft
   o  0:8fa14d15e168 added hgignore
       () [default] draft
@@ -323,41 +311,32 @@
   with: [5] watbar to a
   base: [1] added a
   rebasing "other" content-divergent changeset 8e222f257bbf on 2228e3b74514
-  updating to "local" side of the conflict: c04ff147ef79
-  merging "other" content-divergent changeset '186bdc2cdfa2'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  6 new orphan changesets
   merge:[11] added b
   with: [6] added b
   base: [2] added b
   rebasing "other" content-divergent changeset d5f148423c16 on c04ff147ef79
-  updating to "local" side of the conflict: 6eb54b5af3fb
-  merging "other" content-divergent changeset '8542f15656e7'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merge:[12] added c
   with: [7] added c
   base: [3] added c
   rebasing "other" content-divergent changeset 3ce4be6d8e5e on 6eb54b5af3fb
-  updating to "local" side of the conflict: 8ed612937375
-  merging "other" content-divergent changeset 'a690ce53104a'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merge:[13] added d
   with: [8] added d
   base: [4] added d
   rebasing "other" content-divergent changeset c72d2885eb51 on 8ed612937375
-  updating to "local" side of the conflict: d45f050514c2
-  merging "other" content-divergent changeset '1d1772990a3b'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory is now at 5f7a38bdb75c
+  working directory is now at 74fbf3e6a0b6
 
   $ hg glog
-  @  21:5f7a38bdb75c added d
+  o  21:5f7a38bdb75c added d
   |   () [default] draft
   o  19:9865d598f0e0 added c
   |   () [default] draft
   o  17:ac70b8c8eb63 added b
   |   () [default] draft
-  o  15:74fbf3e6a0b6 watbar to a
+  @  15:74fbf3e6a0b6 watbar to a
   |   () [default] draft
   o  9:2228e3b74514 add newfile
   |   () [default] draft
--- a/tests/test-evolve-continue.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-continue.t	Wed Jun 05 17:46:06 2019 +0200
@@ -31,7 +31,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-Simple case of evolve --continue (with --[no-]update flag)
+Simple case of evolve --continue
 
   $ hg up ca1b80f7960a
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -53,7 +53,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-  $ hg evolve --all --no-update
+  $ hg evolve --all
   move:[4] added d
   atop:[5] added c
   merging d
@@ -113,7 +113,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-  $ hg evolve
+  $ hg evolve --update
   move:[7] added e
   atop:[8] added d
   merging e
@@ -153,7 +153,7 @@
   $ hg amend
   3 new orphan changesets
 
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[2] added b
   atop:[9] added a
   merging b
@@ -236,7 +236,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[12] added d
   atop:[16] added c
   move:[13] added f
@@ -294,7 +294,7 @@
   $ hg amend
   2 new orphan changesets
 
-  $ hg evolve --all --confirm<<EOF
+  $ hg evolve --all --update --confirm << EOF
   > y
   > EOF
   move:[19] added g
@@ -310,7 +310,7 @@
   (no more unresolved files)
   continue: hg evolve --continue
 
-  $ hg evolve --continue<<EOF
+  $ hg evolve --continue << EOF
   > y
   > EOF
   evolving 19:981e615b14ca "added g"
--- a/tests/test-evolve-cycles.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-cycles.t	Wed Jun 05 17:46:06 2019 +0200
@@ -55,7 +55,7 @@
   1 changesets pruned
   $ hg prune -s "desc(A)" "desc(C)"
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  working directory now at 2a34000d3544
+  working directory is now at 2a34000d3544
   1 changesets pruned
   $ hg log --hidden -G
   x  changeset:   3:a8df460dbbfe
@@ -200,7 +200,7 @@
   1 changesets pruned
   $ hg prune -s "desc(D)" "desc(F)"
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  working directory now at 868d2e0eb19c
+  working directory is now at 868d2e0eb19c
   1 changesets pruned
   $ hg log --hidden -G
   x  changeset:   6:d9f908fde1a1
--- a/tests/test-evolve-issue5832.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-issue5832.t	Wed Jun 05 17:46:06 2019 +0200
@@ -125,14 +125,13 @@
   enter the index of the revision you want to select: 1
   move:[9] merge commit
   atop:[6] added c
-  working directory is now at 28a0775ac832
 
   $ hg glog
-  @    10:28a0775ac832 merge commit
+  o    10:28a0775ac832 merge commit
   |\    () draft
   | o  8:2baf8bae7ea4 added b
   | |   () draft
-  | | o  7:5841d7cf9893 added d
+  | | @  7:5841d7cf9893 added d
   | | |   () draft
   o---+  6:62fb70414f99 added c
    / /    () draft
@@ -266,14 +265,13 @@
   enter the index of the revision you want to select: 2
   move:[10] merge commit
   atop:[8] added d
-  working directory is now at 460e6e72b7f9
 
   $ hg glog
-  @    11:460e6e72b7f9 merge commit
+  o    11:460e6e72b7f9 merge commit
   |\    () draft
   | o  9:da76bb7cd904 added b
   | |   () draft
-  o |  8:5841d7cf9893 added d
+  @ |  8:5841d7cf9893 added d
   | |   () draft
   +---o  7:62fb70414f99 added c
   | |     () draft
@@ -284,6 +282,8 @@
   o  0:bde1d2b6b5e5 added base
       () draft
 
+  $ cd ..
+
 Test for issue5946 present at https://bz.mercurial-scm.org/show_bug.cgi?id=5946
 ===============================================================================
 issue with computing dependency with split and merge
@@ -412,14 +412,13 @@
   atop:[8] added d
   move:[10] merge commit
   atop:[9] added b
-  working directory is now at 578c938ebd2e
 
   $ hg glog
-  @    11:578c938ebd2e merge commit
+  o    11:578c938ebd2e merge commit
   |\    () draft
   | o  9:da76bb7cd904 added b
   | |   () draft
-  o |  8:5841d7cf9893 added d
+  @ |  8:5841d7cf9893 added d
   | |   () draft
   +---o  7:62fb70414f99 added c
   | |     () draft
--- a/tests/test-evolve-issue5881.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-issue5881.t	Wed Jun 05 17:46:06 2019 +0200
@@ -50,4 +50,4 @@
   working directory is now at e6048a693c0d
   move:[2] added c
   atop:[3] updated b
-  working directory is now at c3a628eb9aaf
+  working directory is now at e6048a693c0d
--- a/tests/test-evolve-issue5966.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-issue5966.t	Wed Jun 05 17:46:06 2019 +0200
@@ -54,7 +54,7 @@
   o  0: empty
   
 
-  $ hg evolve -t :fail
+  $ hg evolve -t :fail --rev 'first(orphan())'
   move:[2] banana
   atop:[4] apricot
   fix conflicts and see `hg help evolve.interrupted`
@@ -91,7 +91,7 @@
   R a
   $ hg evolve --continue
   evolving 2:34a690fcf6ab "banana"
-  working directory is now at e4207a610ed0
+  working directory is now at 581a2bb4704c
   $ hg resolve --list
 
 evolve the rest of the stack
@@ -100,16 +100,15 @@
   move:[3] coconut
   atop:[5] banana
   merging a
-  working directory is now at d77b4639fe26
 
 All commit evolved
 
   $ hg glog
-  @  6: coconut
+  o  6: coconut
   |
   o  5: banana
   |
-  o  4: apricot
+  @  4: apricot
   |
   o  0: empty
   
--- a/tests/test-evolve-noupdate.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-noupdate.t	Wed Jun 05 17:46:06 2019 +0200
@@ -1,10 +1,10 @@
 Testing the `--no-update` flag to `hg evolve` command
 =====================================================
 
-There is an `--update` flag to `hg evolve` command which defaults to True. The
-`--update` flag updates to the head of the evolved revisions. If you dont want
+There is an `--update` flag to `hg evolve` command which defaults to False. The
+`--update` flag updates to the head of the evolved revisions. If you don't want
 to change your working directory or update your working directory to its
-sucessor after hg evolve, `hg evolve --no-update` is the thing for you.
+successor after hg evolve, `hg evolve --no-update` is the thing for you.
 
 This patch tests that flag.
 
@@ -37,7 +37,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-Making sure we stay where we were is current wdir parent is not obsoleted
+Making sure we stay where we were if current wdir parent was not obsoleted
 --------------------------------------------------------------------------
 
   $ hg up .^^
@@ -59,7 +59,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-There is 'working directory is now at' message because it didnt changed
+There is no 'working directory is now at' message because we didn't update
   $ hg evolve --all --no-update
   move:[3] added c
   atop:[5] added b
--- a/tests/test-evolve-obshistory-prune.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-obshistory-prune.t	Wed Jun 05 17:46:06 2019 +0200
@@ -38,7 +38,7 @@
   
   $ hg prune -r 'desc(B0)'
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at 471f378eab4c
+  working directory is now at 471f378eab4c
   1 changesets pruned
   $ sync
   $ hg log --hidden -G
--- a/tests/test-evolve-order.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-order.t	Wed Jun 05 17:46:06 2019 +0200
@@ -62,12 +62,11 @@
   move:[2] add _b
   atop:[4] add _a
   move:[3] add _c
-  working directory is now at 52b8f9b04f83
 
 evolve --rev reorders the rev to solve instability. Harder case, obsolescence
 accross three stacks in growing rev numbers.
   $ hg up "desc(_c)"
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ mkcommit _d
   $ hg up "desc(_a)"
   0 files updated, 0 files merged, 3 files removed, 0 files unresolved
@@ -76,9 +75,8 @@
   $ hg evolve --rev "desc(_b)"
   move:[5] add _b
   atop:[8] aprime
-  working directory is now at 476c9c052aae
   $ hg up "desc(_b) - obsolete()"
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg amend -m "bprime"
   $ hg up "desc(aprime)"
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -101,7 +99,7 @@
   |/
   o  0:f92638be10c7@default(public) add p
   
-  $ hg evolve --rev "orphan()"
+  $ hg evolve --rev "orphan()" --update
   move:[10] bprime
   atop:[11] asecond
   move:[6] add _c
@@ -204,10 +202,9 @@
   atop:[21] add c1second
   move:[25] add b4_
   atop:[27] add b3prime
-  working directory is now at ea93190a9cd1
 
 Cleanup
-  $ hg evolve --rev "(desc(_d)::)"
+  $ hg evolve --rev "(desc(_d)::)" --update
   move:[17] add c3_
   atop:[28] add c2prime
   move:[18] add c4_
@@ -257,5 +254,3 @@
   move:[29] add b4_
   atop:[34] b3second
   skipping 0b9488394e89: divergent rewriting. can't choose destination
-  working directory is now at 31809a198477
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-evolve-orphan-corner-cases.t	Wed Jun 05 17:46:06 2019 +0200
@@ -0,0 +1,123 @@
+=======================================================
+Tests the resolution of orphan changesets: corner cases
+=======================================================
+
+Setup
+=====
+  $ cat >> $HGRCPATH <<EOF
+  > [alias]
+  > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {troubles}\n\n"
+  > [phases]
+  > publish = False
+  > [extensions]
+  > rebase =
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
+
+  $ glog() {
+  >   hg log -G --template '{rev}:{node|short}@{branch}({phase}) {desc|firstline}\n' "$@"
+  > }
+
+Test to make sure that `lastsolved` always has correct value and things don't break:
+------------------------------------------------------------------------------------
+(before we were not updating it in case of orphan merge)
+
+Prepare the repo:
+  $ hg init orphanmergerepo
+  $ cd orphanmergerepo
+  $ for fn in a b c; do echo foo > $fn; hg ci -Am "added "$fn; done;
+  adding a
+  adding b
+  adding c
+Let's create a merge commit so that we can create orphan merge later:
+  $ hg up 1 -q
+  $ echo feature > f
+  $ hg ci -Am "added feature f"
+  adding f
+  created new head
+  $ hg merge
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg ci -m "merge feature branch"
+  $ glog
+  @    4:2c0a98d38026@default(draft) merge feature branch
+  |\
+  | o  3:4c33e511041e@default(draft) added feature f
+  | |
+  o |  2:8be98ac1a569@default(draft) added c
+  |/
+  o  1:80e6d2c47cfe@default(draft) added b
+  |
+  o  0:f7ad41964313@default(draft) added a
+  
+
+Now make the parents of merge commit obsolete to get a orphan merge:
+  $ hg up 2 -q
+  $ echo "fixit" > c
+  $ hg ci --amend -m "updated c"
+  1 new orphan changesets
+  $ hg up 3 -q
+  $ echo "fixit" > c
+  $ hg ci --amend -m "updated f"
+  $ glog
+  @  6:086d9bedcd75@default(draft) updated f
+  |
+  | o  5:f84f2c548fbc@default(draft) updated c
+  |/
+  | *    4:2c0a98d38026@default(draft) merge feature branch
+  | |\
+  +---x  3:4c33e511041e@default(draft) added feature f
+  | |
+  | x  2:8be98ac1a569@default(draft) added c
+  |/
+  o  1:80e6d2c47cfe@default(draft) added b
+  |
+  o  0:f7ad41964313@default(draft) added a
+  
+
+To check `lastsolved` contain right value after completion of orphan-merge
+resolution there should be one more instability to be evolved; lets create one:
+  $ hg up 1 -q
+  $ echo d > d
+  $ hg ci -Am "added d"
+  adding c
+  adding d
+  created new head
+  $ echo e > e
+  $ hg ci -Am "added e"
+  adding e
+  $ hg up .^
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo "updated d" >> d
+  $ hg ci --amend -m "updated d"
+  1 new orphan changesets
+  $ glog
+  @  9:7c4d1834c346@default(draft) updated d
+  |
+  | *  8:421f7614462a@default(draft) added e
+  | |
+  | x  7:afe5acea1990@default(draft) added d
+  |/
+  | o  6:086d9bedcd75@default(draft) updated f
+  |/
+  | o  5:f84f2c548fbc@default(draft) updated c
+  |/
+  | *    4:2c0a98d38026@default(draft) merge feature branch
+  | |\
+  +---x  3:4c33e511041e@default(draft) added feature f
+  | |
+  | x  2:8be98ac1a569@default(draft) added c
+  |/
+  o  1:80e6d2c47cfe@default(draft) added b
+  |
+  o  0:f7ad41964313@default(draft) added a
+  
+Now we have one orphan merge and one more orphan cset that we just created.
+Lets evolve:
+  $ hg evolve --all --any
+  move:[4] merge feature branch
+  atop:[5] updated c
+  move:[10] merge feature branch
+  atop:[6] updated f
+  move:[8] added e
+  atop:[9] updated d
--- a/tests/test-evolve-orphan-merge.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-orphan-merge.t	Wed Jun 05 17:46:06 2019 +0200
@@ -65,7 +65,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[3] merging a and b
   atop:[4] added b
   working directory is now at 91fd62122a4b
@@ -110,7 +110,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[5] merging a and b
   atop:[6] added a
   working directory is now at 968d205ba4d8
@@ -214,7 +214,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[10] foobar to c
   atop:[11] foo to c
   merging c
@@ -269,7 +269,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[12] foobar to c
   atop:[13] foo to c
   merging c
@@ -301,7 +301,7 @@
 
   $ hg prune -r d0f84b25d4e3 -r 928097d0b5b5 -r dc1948a6eeab
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at 8fa14d15e168
+  working directory is now at 8fa14d15e168
   3 changesets pruned
 
   $ for ch in l m; do echo foo > $ch; hg ci -Aqm "added "$ch; done;
@@ -346,7 +346,7 @@
   |/    () draft
   o  0:8fa14d15e168 added hgignore
       () draft
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[16] added m
   atop:[20] added l
   move:[19] merge commit
@@ -371,7 +371,7 @@
 
   $ hg prune -r a446ad3e6700 -r 495d2039f8f1 -r 863d11043c67
   0 files updated, 0 files merged, 3 files removed, 0 files unresolved
-  working directory now at fccc9de66799
+  working directory is now at fccc9de66799
   3 changesets pruned
 
   $ hg glog
@@ -411,7 +411,7 @@
       () draft
 
 XXX: We should handle this case too
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[23] merged l and x
   atop:[25] added x
   move:[26] merged l and x
@@ -543,7 +543,7 @@
 
   $ hg prune -r .
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory now at 8fa14d15e168
+  working directory is now at 8fa14d15e168
   1 changesets pruned
   $ hg up null
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
--- a/tests/test-evolve-orphan-split.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-orphan-split.t	Wed Jun 05 17:46:06 2019 +0200
@@ -74,7 +74,7 @@
   o  0:8fa14d15e168 added hgignore
       () draft
 
-  $ hg evolve
+  $ hg evolve --update
   move:[2] added c
   atop:[4] added a and b
   working directory is now at af13f0560b31
@@ -270,4 +270,3 @@
   enter the index of the revision you want to select: 1
   move:[7] added d
   atop:[8] added a b c
-  working directory is now at 71e4d45a7aaa
--- a/tests/test-evolve-phase-divergence.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-phase-divergence.t	Wed Jun 05 17:46:06 2019 +0200
@@ -198,7 +198,7 @@
 XXX: evolve should have mentioned that draft commit is just obsoleted in favour
 of public one. From the message it looks like a new commit is created.
 
-  $ hg evolve --phase-divergent
+  $ hg evolve --phase-divergent --update
   recreate:[2] tweak a
   atop:[1] modify a
   no changes to commit
@@ -313,7 +313,7 @@
 XXX: we should document what should user expect where running this, writing this
 test I have to go through code base to understand what will be the behavior
 
-  $ hg evolve --phase-divergent
+  $ hg evolve --phase-divergent --update
   recreate:[4] added bar to foo
   atop:[3] added foo to foo
   committed as 3d62500c673d
@@ -464,7 +464,7 @@
 Resolving the new phase-divergence changeset using `hg evolve`
 ---------------------------------------------------------------
 
-  $ hg evolve --phase-divergent
+  $ hg evolve --phase-divergent --update
   recreate:[7] foo to bar
   atop:[6] added bar to bar
   committed as 502e73736632
@@ -599,7 +599,7 @@
 Using `hg evolve` to resolve phase-divergence
 ---------------------------------------------
 
-  $ hg evolve --phase-divergent
+  $ hg evolve --phase-divergent --update
   recreate:[10] added x to x
   atop:[9] added x to x
   rebasing to destination parent: 502e73736632
@@ -720,7 +720,7 @@
 Resolving divergence using `hg evolve`
 -------------------------------------
 
-  $ hg evolve --phase-divergent
+  $ hg evolve --phase-divergent --update
   recreate:[14] y to y and foobar to foo
   atop:[12] y to y and foobar to foo
   rebasing to destination parent: 2352021b3785
@@ -796,7 +796,7 @@
 Resolution using `hg evolve --phase-divergent`
 ----------------------------------------------
 
-  $ hg evolve --phase-divergent
+  $ hg evolve --phase-divergent --update
   recreate:[19] added l to l
   atop:[17] added l to l
   rebasing to destination parent: 8c2bb6fb44e9
@@ -926,14 +926,14 @@
   atop:[23] added g
   rebasing to destination parent: 21ae52e414e6
   no changes to commit
-  working directory is now at 428f7900a969
+  working directory is now at e3090241a10c
 
   $ hg glog -r f3794e5a91dc::
-  @  23:428f7900a969 added g
+  o  23:428f7900a969 added g
   |   () public
   o  22:21ae52e414e6 added f
   |   () public
-  o  21:e3090241a10c phase-divergent update to f3794e5a91dc:
+  @  21:e3090241a10c phase-divergent update to f3794e5a91dc:
   |   () public
   o  17:f3794e5a91dc added l to l
   |   () public
@@ -992,7 +992,6 @@
   recreate:[2] added m
   atop:[1] added m and n
   committed as 86419909e017
-  1 new orphan changesets
   recreate:[3] added n
   atop:[1] added m and n
   rebasing to destination parent: d3873e73d99e
@@ -1253,7 +1252,6 @@
   recreate:[2] added m
   atop:[1] added m and n
   committed as 86419909e017
-  1 new orphan changesets
   recreate:[4] added n
   atop:[1] added m and n
   rebasing to destination parent: d3873e73d99e
--- a/tests/test-evolve-phase.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-phase.t	Wed Jun 05 17:46:06 2019 +0200
@@ -36,11 +36,10 @@
   $ hg evolve
   move:[2] c
   atop:[3] b
-  working directory is now at 813dde83a7f3
   $ hg glog
-  @  4 - 813dde83a7f3 c (secret)
+  o  4 - 813dde83a7f3 c (secret)
   |
-  o  3 - fd89d0f19529 b (draft)
+  @  3 - fd89d0f19529 b (draft)
   |
   o  0 - cb9a9f314b8b a (draft)
   
@@ -116,12 +115,12 @@
   continue: hg evolve --continue
   $ hg evolve -c
   evolving 2:13833940840c "c"
-  working directory is now at 3d2080c198e5
+  working directory is now at 87495ea7c9ec
 
   $ hg glog
-  @  4 - 3d2080c198e5 c (secret)
+  o  4 - 3d2080c198e5 c (secret)
   |
-  o  3 - 87495ea7c9ec b (draft)
+  @  3 - 87495ea7c9ec b (draft)
   |
   o  0 - cb9a9f314b8b a (draft)
   
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-evolve-progress.t	Wed Jun 05 17:46:06 2019 +0200
@@ -0,0 +1,191 @@
+Test Evolve progress output
+===========================
+
+  $ . "$TESTDIR/testlib/common.sh"
+  $ cat >> $HGRCPATH <<EOF
+  > [extensions]
+  > evolve=
+  > EOF
+
+  $ hg init progress
+  $ cd progress
+  $ echo a > a
+  $ hg ci -Aqm first
+  $ echo a2 > a
+  $ hg ci -m second
+  $ echo b > b
+  $ hg ci -Aqm third
+  $ echo b2 > b
+  $ hg ci -m fourth
+
+Test progress with --all
+  $ hg co -q 'desc("first")'
+  $ hg amend -m 'first v2'
+  3 new orphan changesets
+  $ hg evolve --config progress.debug=yes --debug
+  evolve: 1/3 changesets (33.33%)
+  move:[1] second
+  atop:[4] first v2
+  hg rebase -r 4f60c78b6d58 -d fd0a2402f834
+  evolve: 1/3 changesets (33.33%)
+  resolving manifests
+   branchmerge: True, force: True, partial: False
+   ancestor: a87874c6ec31, local: fd0a2402f834+, remote: 4f60c78b6d58
+   a: remote is newer -> g
+  getting a
+  updating: a 1/1 files (100.00%)
+  committing files:
+  a
+  committing manifest
+  committing changelog
+  evolve: 2/3 changesets (66.67%)
+  move:[2] third
+  hg rebase -r 769574b07a96 -d 5f16d91ecde0
+  evolve: 2/3 changesets (66.67%)
+  resolving manifests
+   branchmerge: True, force: True, partial: False
+   ancestor: 4f60c78b6d58, local: 5f16d91ecde0+, remote: 769574b07a96
+   b: remote created -> g
+  getting b
+  updating: b 1/1 files (100.00%)
+  committing files:
+  b
+  committing manifest
+  committing changelog
+  evolve: 3/3 changesets (100.00%)
+  move:[3] fourth
+  hg rebase -r 22782fddc0ab -d 53c0008d98a0
+  evolve: 3/3 changesets (100.00%)
+  resolving manifests
+   branchmerge: True, force: True, partial: False
+   ancestor: 769574b07a96, local: 53c0008d98a0+, remote: 22782fddc0ab
+   b: remote is newer -> g
+  getting b
+  updating: b 1/1 files (100.00%)
+  committing files:
+  b
+  committing manifest
+  committing changelog
+  updating the branch cache
+  obscache is out of date
+  invalid branchheads cache (served): tip differs
+  resolving manifests
+   branchmerge: False, force: False, partial: False
+   ancestor: 385376d04062, local: 385376d04062+, remote: fd0a2402f834
+   b: other deleted -> r
+  removing b
+  updating: b 1/2 files (50.00%)
+   a: remote is newer -> g
+  getting a
+  updating: a 2/2 files (100.00%)
+
+Test progress with -r
+  $ hg co -q 'desc("first")'
+  $ hg amend -m 'first v3'
+  3 new orphan changesets
+  $ hg evolve -r 'desc("second")' --config progress.debug=yes --debug
+  evolve: 1/1 changesets (100.00%)
+  move:[5] second
+  atop:[8] first v3
+  hg rebase -r 5f16d91ecde0 -d 152c368c622b
+  evolve: 1/1 changesets (100.00%)
+  resolving manifests
+   branchmerge: True, force: True, partial: False
+   ancestor: fd0a2402f834, local: 152c368c622b+, remote: 5f16d91ecde0
+   a: remote is newer -> g
+  getting a
+  updating: a 1/1 files (100.00%)
+  committing files:
+  a
+  committing manifest
+  committing changelog
+  updating the branch cache
+  obscache is out of date
+  resolving manifests
+   branchmerge: False, force: False, partial: False
+   ancestor: df5d742141b0, local: df5d742141b0+, remote: 152c368c622b
+   a: remote is newer -> g
+  getting a
+  updating: a 1/1 files (100.00%)
+
+Test progress with --continue
+  $ hg co -q 'desc("first")'
+  $ echo conflict > a
+  $ hg amend -m 'first v4'
+  1 new orphan changesets
+  $ hg evolve --all --config progress.debug=yes --debug
+  evolve: 1/3 changesets (33.33%)
+  move:[9] second
+  atop:[10] first v4
+  hg rebase -r df5d742141b0 -d f8d7d38c0a88
+  evolve: 1/3 changesets (33.33%)
+  resolving manifests
+   branchmerge: True, force: True, partial: False
+   ancestor: 152c368c622b, local: f8d7d38c0a88+, remote: df5d742141b0
+   preserving a for resolve of a
+   a: versions differ -> m (premerge)
+  updating: a 1/1 files (100.00%)
+  picked tool ':merge' for a (binary False symlink False changedelete False)
+  merging a
+  my a@f8d7d38c0a88+ other a@df5d742141b0 ancestor a@152c368c622b
+   a: versions differ -> m (merge)
+  updating: a 2/2 files (100.00%)
+  picked tool ':merge' for a (binary False symlink False changedelete False)
+  my a@f8d7d38c0a88+ other a@df5d742141b0 ancestor a@152c368c622b
+  warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+  $ echo resolved > a
+  $ hg resolve -m a
+  (no more unresolved files)
+  continue: hg evolve --continue
+  $ hg evolve --continue --config progress.debug=yes --debug
+  evolving 9:df5d742141b0 "second"
+  committing files:
+  a
+  committing manifest
+  committing changelog
+  updating the branch cache
+  obscache is out of date
+  move:[6] third
+  atop:[11] second
+  hg rebase -r 53c0008d98a0 -d 60a86497fbfe
+  evolve: 2/3 changesets (66.67%)
+  resolving manifests
+   branchmerge: True, force: True, partial: False
+   ancestor: 5f16d91ecde0, local: 60a86497fbfe+, remote: 53c0008d98a0
+   b: remote created -> g
+  getting b
+  updating: b 1/1 files (100.00%)
+  committing files:
+  b
+  committing manifest
+  committing changelog
+  move:[7] fourth
+  hg rebase -r 385376d04062 -d b2de95304e32
+  evolve: 3/3 changesets (100.00%)
+  resolving manifests
+   branchmerge: True, force: True, partial: False
+   ancestor: 53c0008d98a0, local: b2de95304e32+, remote: 385376d04062
+   b: remote is newer -> g
+  getting b
+  updating: b 1/1 files (100.00%)
+  committing files:
+  b
+  committing manifest
+  committing changelog
+  updating the branch cache
+  obscache is out of date
+  invalid branchheads cache (served): tip differs
+  resolving manifests
+   branchmerge: False, force: False, partial: False
+   ancestor: c6e6fdb1d046, local: c6e6fdb1d046+, remote: f8d7d38c0a88
+   b: other deleted -> r
+  removing b
+  updating: b 1/2 files (50.00%)
+   a: remote is newer -> g
+  getting a
+  updating: a 2/2 files (100.00%)
+  working directory is now at f8d7d38c0a88
+
+  $ cd ..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-evolve-public-content-divergent-corner-cases.t	Wed Jun 05 17:46:06 2019 +0200
@@ -0,0 +1,762 @@
+===============================================================
+Tests the resolution of public content divergence: corner cases
+===============================================================
+
+This file intend to cover cases that are specific enough to not fit in the
+other cases.
+
+Setup
+=====
+  $ cat >> $HGRCPATH <<EOF
+  > [alias]
+  > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {instabilities}\n\n"
+  > [phases]
+  > publish = False
+  > [extensions]
+  > rebase =
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
+
+Testing when divergence is not created by actual diff change, but because of rebasing:
+--------------------------------------------------------------------------------------
+
+Prepare the repo:
+
+  $ hg init rebasediv
+  $ cd rebasediv
+  $ for ch in a b c; do
+  >   echo $ch > $ch;
+  >   hg ci -Am "added "$ch;
+  > done;
+  adding a
+  adding b
+  adding c
+
+  $ hg glog
+  @  2:155349b645be added c
+  |   draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+On server side: a new cset is added based on rev 1 and rev 2 is rebased on newly added cset:
+
+  $ hg up .^ -q
+  $ echo d > d
+  $ hg ci -Am "added d"
+  adding d
+  created new head
+
+  $ hg rebase -r 2 -d .
+  rebasing 2:155349b645be "added c"
+
+  $ hg glog
+  o  4:c0d7ee6604ea added c
+  |   draft
+  |
+  @  3:c9241b0f2d5b added d
+  |   draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+On user side: user has not pulled yet and amended the rev 2 which created the divergence after pull:
+  $ hg up 2 --hidden -q
+  updating to a hidden changeset 155349b645be
+  (hidden revision '155349b645be' was rewritten as: c0d7ee6604ea)
+  working directory parent is obsolete! (155349b645be)
+
+  $ echo cc >> c
+  $ hg ci --amend -m "updated c"
+  2 new content-divergent changesets
+
+Lets change the phase to --public of branch which is pulled from server:
+  $ hg phase --public -r 4
+  $ hg glog -p
+  @  5:f5f9b4fc8b77 updated c
+  |   draft content-divergent
+  |
+  |  diff -r 5f6d8a4bf34a -r f5f9b4fc8b77 c
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,2 @@
+  |  +c
+  |  +cc
+  |
+  | o  4:c0d7ee6604ea added c
+  | |   public
+  | |
+  | |  diff -r c9241b0f2d5b -r c0d7ee6604ea c
+  | |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  | |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  | |  @@ -0,0 +1,1 @@
+  | |  +c
+  | |
+  | o  3:c9241b0f2d5b added d
+  |/    public
+  |
+  |    diff -r 5f6d8a4bf34a -r c9241b0f2d5b d
+  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |    +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+  |    @@ -0,0 +1,1 @@
+  |    +d
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  |  diff -r 9092f1db7931 -r 5f6d8a4bf34a b
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +b
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+     diff -r 000000000000 -r 9092f1db7931 a
+     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
+     @@ -0,0 +1,1 @@
+     +a
+  
+
+Evolve:
+  $ hg evolve --content-divergent
+  merge:[4] added c
+  with: [5] updated c
+  base: [2] added c
+  rebasing "other" content-divergent changeset f5f9b4fc8b77 on c9241b0f2d5b
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  committed as 3b336cbee992
+  working directory is now at 3b336cbee992
+
+  $ hg glog -p
+  @  8:3b336cbee992 phase-divergent update to c0d7ee6604ea:
+  |   draft
+  |
+  |  diff -r c0d7ee6604ea -r 3b336cbee992 c
+  |  --- a/c	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -1,1 +1,2 @@
+  |   c
+  |  +cc
+  |
+  o  4:c0d7ee6604ea added c
+  |   public
+  |
+  |  diff -r c9241b0f2d5b -r c0d7ee6604ea c
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c
+  |
+  o  3:c9241b0f2d5b added d
+  |   public
+  |
+  |  diff -r 5f6d8a4bf34a -r c9241b0f2d5b d
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +d
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  |  diff -r 9092f1db7931 -r 5f6d8a4bf34a b
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +b
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+     diff -r 000000000000 -r 9092f1db7931 a
+     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
+     @@ -0,0 +1,1 @@
+     +a
+  
+Check that we don't have any unstable cset now:
+  $ hg evolve -l
+  $ cd ..
+
+Different parent, simple conflict on relocate, deleted file on actual merge
+---------------------------------------------------------------------------
+
+Changeset "added c e" is also removing 'd'. This should conflict with the update
+to 'd' in the successors of 'adding d' when solving the content divergence.
+
+  $ hg init pubdiv-parent-deleted-file
+  $ cd pubdiv-parent-deleted-file
+  $ for ch in a b c d; do
+  >   echo $ch > $ch;
+  >   hg ci -Aqm "added "$ch;
+  > done;
+
+  $ hg up 'desc("added b")'
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo cfoo > c
+  $ echo e > e
+  $ hg add c e
+  $ hg ci -m "added c e"
+  created new head
+
+  $ hg up 'desc("re:added c$")'
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo dd > d
+  $ hg add d
+  $ hg ci -m "added d"
+  created new head
+
+  $ hg glog --patch --rev 'sort(all(), "topo")'
+  @  5:93cd84bbdaca added d
+  |   draft
+  |
+  |  diff -r 155349b645be -r 93cd84bbdaca d
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +dd
+  |
+  | o  3:9150fe93bec6 added d
+  |/    draft
+  |
+  |    diff -r 155349b645be -r 9150fe93bec6 d
+  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |    +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+  |    @@ -0,0 +1,1 @@
+  |    +d
+  |
+  o  2:155349b645be added c
+  |   draft
+  |
+  |  diff -r 5f6d8a4bf34a -r 155349b645be c
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c
+  |
+  | o  4:e568fd1029bb added c e
+  |/    draft
+  |
+  |    diff -r 5f6d8a4bf34a -r e568fd1029bb c
+  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |    +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  |    @@ -0,0 +1,1 @@
+  |    +cfoo
+  |    diff -r 5f6d8a4bf34a -r e568fd1029bb e
+  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |    +++ b/e	Thu Jan 01 00:00:00 1970 +0000
+  |    @@ -0,0 +1,1 @@
+  |    +e
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  |  diff -r 9092f1db7931 -r 5f6d8a4bf34a b
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +b
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+     diff -r 000000000000 -r 9092f1db7931 a
+     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
+     @@ -0,0 +1,1 @@
+     +a
+  
+  $ hg prune 'min(desc("added d"))' -s 'max(desc("added d"))'
+  1 changesets pruned
+  $ hg prune 'min(desc("added d"))' -s 'desc("added c e")' --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+
+Change phase to public for one head:
+  $ hg phase --public -r 'max(desc("added d"))'
+
+  $ hg glog
+  @  5:93cd84bbdaca added d
+  |   public
+  |
+  | *  4:e568fd1029bb added c e
+  | |   draft content-divergent
+  | |
+  o |  2:155349b645be added c
+  |/    public
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+
+  $ hg glog --patch --rev 'sort(all(), "topo")' --hidden
+  @  5:93cd84bbdaca added d
+  |   public
+  |
+  |  diff -r 155349b645be -r 93cd84bbdaca d
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +dd
+  |
+  | x  3:9150fe93bec6 added d
+  |/    draft
+  |
+  |    diff -r 155349b645be -r 9150fe93bec6 d
+  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |    +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+  |    @@ -0,0 +1,1 @@
+  |    +d
+  |
+  o  2:155349b645be added c
+  |   public
+  |
+  |  diff -r 5f6d8a4bf34a -r 155349b645be c
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c
+  |
+  | *  4:e568fd1029bb added c e
+  |/    draft content-divergent
+  |
+  |    diff -r 5f6d8a4bf34a -r e568fd1029bb c
+  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |    +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  |    @@ -0,0 +1,1 @@
+  |    +cfoo
+  |    diff -r 5f6d8a4bf34a -r e568fd1029bb e
+  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |    +++ b/e	Thu Jan 01 00:00:00 1970 +0000
+  |    @@ -0,0 +1,1 @@
+  |    +e
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  |  diff -r 9092f1db7931 -r 5f6d8a4bf34a b
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +b
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+     diff -r 000000000000 -r 9092f1db7931 a
+     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
+     @@ -0,0 +1,1 @@
+     +a
+  
+
+  $ hg obslog --all --rev tip --patch
+  @  93cd84bbdaca (5) added d
+  |
+  | *  e568fd1029bb (4) added c e
+  |/
+  x  9150fe93bec6 (3) added d
+       rewritten(content) as 93cd84bbdaca using prune by test (Thu Jan 01 00:00:00 1970 +0000)
+         diff -r 9150fe93bec6 -r 93cd84bbdaca d
+         --- a/d	Thu Jan 01 00:00:00 1970 +0000
+         +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+         @@ -1,1 +1,1 @@
+         -d
+         +dd
+  
+       rewritten(description, parent, content) as e568fd1029bb using prune by test (Thu Jan 01 00:00:00 1970 +0000)
+         (No patch available, changesets rebased)
+  
+
+  $ hg evolve --content-divergent --any --update
+  merge:[5] added d
+  with: [4] added c e
+  base: [3] added d
+  rebasing "other" content-divergent changeset e568fd1029bb on 155349b645be
+  merging c
+  warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ hg diff
+  diff -r 155349b645be c
+  --- a/c	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  @@ -1,1 +1,5 @@
+  +<<<<<<< destination: 155349b645be - test: added c
+   c
+  +=======
+  +cfoo
+  +>>>>>>> evolving:    e568fd1029bb - test: added c e
+  diff -r 155349b645be e
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,1 @@
+  +e
+
+  $ echo c > c
+  $ hg res -m
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  evolving 4:e568fd1029bb "added c e"
+  local changed d which other deleted
+  use (c)hanged version, (d)elete, or leave (u)nresolved? u
+  1 files updated, 0 files merged, 0 files removed, 1 files unresolved
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ hg sum
+  parent: 5:93cd84bbdaca 
+   added d
+  parent: 6:2af3359250d3 tip (content-divergent)
+   added c e
+  branch: default
+  commit: 1 modified, 1 unknown, 1 unresolved (merge)
+  update: (current)
+  phases: 1 draft
+  content-divergent: 1 changesets
+  evolve: (evolve --continue)
+
+  $ echo resolved > d
+  $ hg resolve -m d
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  committed as bc1f4610744c
+  working directory is now at bc1f4610744c
+
+  $ hg export
+  # HG changeset patch
+  # User test
+  # Date 0 0
+  #      Thu Jan 01 00:00:00 1970 +0000
+  # Node ID bc1f4610744c6aa0e851d3876a61bfff6243b31c
+  # Parent  93cd84bbdacaeb8f881c29a609dbdd30c38cbc57
+  phase-divergent update to 93cd84bbdaca:
+  
+  added c e
+  
+  diff -r 93cd84bbdaca -r bc1f4610744c d
+  --- a/d	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+  @@ -1,1 +1,1 @@
+  -dd
+  +resolved
+  diff -r 93cd84bbdaca -r bc1f4610744c e
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,1 @@
+  +e
+
+  $ hg evolve -l
+  $ cd ..
+
+Test a pratical "rebase" case
+=============================
+
+Initial setup
+
+  $ hg init rebase-divergence
+  $ cd rebase-divergence
+  $ echo root >> root
+  $ hg add root
+  $ hg commit -m root
+  $ for x in c_A c_B c_C c_D; do
+  >     echo $x >> $x
+  >     hg add $x
+  >     hg commit -m $x
+  > done
+
+  $ hg up 'desc("c_A")'
+  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+
+  $ for x in c_E c_F; do
+  >     echo $x >> $x
+  >     hg add $x
+  >     hg commit -m $x
+  > done
+  created new head
+
+(creating divergence locally for simplicity)
+
+  $ node=`hg log --rev 'desc("c_E")' -T '{node}'`
+  $ hg rebase -s $node -d 'desc("c_B")'
+  rebasing 5:4ab2719bbab9 "c_E"
+  rebasing 6:77ccbf8d837e "c_F" (tip)
+  $ hg phase --public tip
+  $ hg rebase --hidden -s $node -d 'desc("c_C")' --config experimental.evolution.allowdivergence=yes
+  rebasing 5:4ab2719bbab9 "c_E"
+  rebasing 6:77ccbf8d837e "c_F"
+  2 new content-divergent changesets
+
+  $ hg sum
+  parent: 8:a52ac76b45f5 
+   c_F
+  branch: default
+  commit: (clean)
+  update: 4 new changesets, 3 branch heads (merge)
+  phases: 4 draft
+  content-divergent: 2 changesets
+  $ hg evolve --list
+  b4a584aea4bd: c_E
+    content-divergent: c7d2d47c7240 (public) (precursor 4ab2719bbab9)
+  
+  8ae8db670b4a: c_F
+    content-divergent: a52ac76b45f5 (public) (precursor 77ccbf8d837e)
+  
+  $ hg log -G --patch
+  *  changeset:   10:8ae8db670b4a
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  instability: content-divergent
+  |  summary:     c_F
+  |
+  |  diff -r b4a584aea4bd -r 8ae8db670b4a c_F
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c_F	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c_F
+  |
+  *  changeset:   9:b4a584aea4bd
+  |  parent:      3:abb77b893f28
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  instability: content-divergent
+  |  summary:     c_E
+  |
+  |  diff -r abb77b893f28 -r b4a584aea4bd c_E
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c_E	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c_E
+  |
+  | @  changeset:   8:a52ac76b45f5
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     c_F
+  | |
+  | |  diff -r c7d2d47c7240 -r a52ac76b45f5 c_F
+  | |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  | |  +++ b/c_F	Thu Jan 01 00:00:00 1970 +0000
+  | |  @@ -0,0 +1,1 @@
+  | |  +c_F
+  | |
+  | o  changeset:   7:c7d2d47c7240
+  | |  parent:      2:eb1b4e1205b8
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     c_E
+  | |
+  | |  diff -r eb1b4e1205b8 -r c7d2d47c7240 c_E
+  | |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  | |  +++ b/c_E	Thu Jan 01 00:00:00 1970 +0000
+  | |  @@ -0,0 +1,1 @@
+  | |  +c_E
+  | |
+  +---o  changeset:   4:dbb960d6c97c
+  | |    user:        test
+  | |    date:        Thu Jan 01 00:00:00 1970 +0000
+  | |    summary:     c_D
+  | |
+  | |    diff -r abb77b893f28 -r dbb960d6c97c c_D
+  | |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  | |    +++ b/c_D	Thu Jan 01 00:00:00 1970 +0000
+  | |    @@ -0,0 +1,1 @@
+  | |    +c_D
+  | |
+  o |  changeset:   3:abb77b893f28
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     c_C
+  |
+  |    diff -r eb1b4e1205b8 -r abb77b893f28 c_C
+  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |    +++ b/c_C	Thu Jan 01 00:00:00 1970 +0000
+  |    @@ -0,0 +1,1 @@
+  |    +c_C
+  |
+  o  changeset:   2:eb1b4e1205b8
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     c_B
+  |
+  |  diff -r e31751786014 -r eb1b4e1205b8 c_B
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c_B	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c_B
+  |
+  o  changeset:   1:e31751786014
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     c_A
+  |
+  |  diff -r 1e4be0697311 -r e31751786014 c_A
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c_A	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c_A
+  |
+  o  changeset:   0:1e4be0697311
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     root
+  
+     diff -r 000000000000 -r 1e4be0697311 root
+     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+     +++ b/root	Thu Jan 01 00:00:00 1970 +0000
+     @@ -0,0 +1,1 @@
+     +root
+  
+
+Run automatic evolution
+
+  $ hg evolve --content-divergent --rev 'not public() and desc("c_E")::'
+  merge:[7] c_E
+  with: [9] c_E
+  base: [5] c_E
+  rebasing "other" content-divergent changeset b4a584aea4bd on eb1b4e1205b8
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  content divergence resolution between c7d2d47c7240 (public) and 0773642cfa95 has same content as c7d2d47c7240, discarding 0773642cfa95
+  merge:[8] c_F
+  with: [10] c_F
+  base: [6] c_F
+  rebasing "other" content-divergent changeset 8ae8db670b4a on c7d2d47c7240
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  content divergence resolution between a52ac76b45f5 (public) and 6a87ed4aa317 has same content as a52ac76b45f5, discarding 6a87ed4aa317
+  $ hg sum
+  parent: 8:a52ac76b45f5 tip
+   c_F
+  branch: default
+  commit: (clean)
+  update: 2 new changesets, 2 branch heads (merge)
+  phases: 2 draft
+
+  $ hg evolve --list
+
+  $ hg log -G --patch
+  @  changeset:   8:a52ac76b45f5
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     c_F
+  |
+  |  diff -r c7d2d47c7240 -r a52ac76b45f5 c_F
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c_F	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c_F
+  |
+  o  changeset:   7:c7d2d47c7240
+  |  parent:      2:eb1b4e1205b8
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     c_E
+  |
+  |  diff -r eb1b4e1205b8 -r c7d2d47c7240 c_E
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c_E	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c_E
+  |
+  | o  changeset:   4:dbb960d6c97c
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     c_D
+  | |
+  | |  diff -r abb77b893f28 -r dbb960d6c97c c_D
+  | |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  | |  +++ b/c_D	Thu Jan 01 00:00:00 1970 +0000
+  | |  @@ -0,0 +1,1 @@
+  | |  +c_D
+  | |
+  | o  changeset:   3:abb77b893f28
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     c_C
+  |
+  |    diff -r eb1b4e1205b8 -r abb77b893f28 c_C
+  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |    +++ b/c_C	Thu Jan 01 00:00:00 1970 +0000
+  |    @@ -0,0 +1,1 @@
+  |    +c_C
+  |
+  o  changeset:   2:eb1b4e1205b8
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     c_B
+  |
+  |  diff -r e31751786014 -r eb1b4e1205b8 c_B
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c_B	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c_B
+  |
+  o  changeset:   1:e31751786014
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     c_A
+  |
+  |  diff -r 1e4be0697311 -r e31751786014 c_A
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/c_A	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,1 @@
+  |  +c_A
+  |
+  o  changeset:   0:1e4be0697311
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     root
+  
+     diff -r 000000000000 -r 1e4be0697311 root
+     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+     +++ b/root	Thu Jan 01 00:00:00 1970 +0000
+     @@ -0,0 +1,1 @@
+     +root
+  
+  $ hg export tip
+  # HG changeset patch
+  # User test
+  # Date 0 0
+  #      Thu Jan 01 00:00:00 1970 +0000
+  # Node ID a52ac76b45f523a039fc4a938d79874f4bdb1a85
+  # Parent  c7d2d47c7240562be5cbd1a24080dd0396178709
+  c_F
+  
+  diff -r c7d2d47c7240 -r a52ac76b45f5 c_F
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/c_F	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,1 @@
+  +c_F
+
+  $ hg obslog --rev a52ac76b45f5
+  @    a52ac76b45f5 (8) c_F
+  |\
+  x |  6a87ed4aa317 (12) c_F
+  | |    rewritten as a52ac76b45f5 using evolve by test (Thu Jan 01 00:00:00 1970 +0000)
+  | |
+  x |  8ae8db670b4a (10) c_F
+  |/     rewritten(parent) as 6a87ed4aa317 using evolve by test (Thu Jan 01 00:00:00 1970 +0000)
+  |
+  x  77ccbf8d837e (6) c_F
+       rewritten(parent) as 8ae8db670b4a using rebase by test (Thu Jan 01 00:00:00 1970 +0000)
+       rewritten(parent) as a52ac76b45f5 using rebase by test (Thu Jan 01 00:00:00 1970 +0000)
+  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-evolve-public-content-divergent-discard.t	Wed Jun 05 17:46:06 2019 +0200
@@ -0,0 +1,694 @@
+===============================================================================
+Tests the resolution of public content divergence: when merging leads to public
+===============================================================================
+
+This file intend to cover all the cases possible when merging the other
+divergent cset into public cset leads to public cset itself.
+Possible variants are:
+
+parent: same/different
+relocation: [no-]conflict
+merging: [no-]conflict
+
+Setup
+=====
+  $ cat >> $HGRCPATH <<EOF
+  > [alias]
+  > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {instabilities}\n\n"
+  > [phases]
+  > publish = False
+  > [extensions]
+  > rebase =
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
+
+Testing when same parent, no conflict:
+--------------------------------------
+
+  $ hg init pubdiv1
+  $ cd pubdiv1
+  $ for ch in a b c; do
+  >   echo $ch > $ch;
+  >   hg ci -Am "added "$ch;
+  > done;
+  adding a
+  adding b
+  adding c
+
+  $ hg up .^
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo ch > ch
+  $ hg add ch
+  $ hg ci -m "added ch"
+  created new head
+
+  $ hg up .^
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo ch > ch
+  $ hg add ch
+  $ hg ci -m "added c"
+  created new head
+
+  $ hg glog
+  @  4:f7c1071f1e7c added c
+  |   draft
+  |
+  | o  3:90522bccf499 added ch
+  |/    draft
+  |
+  | o  2:155349b645be added c
+  |/    draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+  $ hg prune 2 -s 3
+  1 changesets pruned
+  $ hg prune 2 -s 4 --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+  $ hg phase --public -r 4
+
+  $ hg glog
+  @  4:f7c1071f1e7c added c
+  |   public
+  |
+  | *  3:90522bccf499 added ch
+  |/    draft content-divergent
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+  $ hg evolve --content-divergent --any
+  merge:[4] added c
+  with: [3] added ch
+  base: [2] added c
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  other divergent changeset 90522bccf499 has same content as local f7c1071f1e7c and differs by "description" only, discarding 90522bccf499
+  content divergence resolution between f7c1071f1e7c (public) and 90522bccf499 has same content as f7c1071f1e7c, discarding 90522bccf499
+
+  $ hg evolve -l
+
+  $ hg par
+  changeset:   4:f7c1071f1e7c
+  tag:         tip
+  parent:      1:5f6d8a4bf34a
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     added c
+  
+  $ cd ..
+
+Testing when different parent, no conflict:
+-------------------------------------------
+
+  $ hg init pubdiv2
+  $ cd pubdiv2
+  $ for ch in a b c d; do
+  >   echo $ch > $ch;
+  >   hg ci -Am "added "$ch;
+  > done;
+  adding a
+  adding b
+  adding c
+  adding d
+
+  $ hg up 1
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo dh > dh
+  $ hg add dh
+  $ hg ci -m "added dh"
+  created new head
+
+  $ hg up 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo dh > dh
+  $ hg add dh
+  $ hg ci -m "added d"
+  created new head
+
+  $ hg glog
+  @  5:e800202333a4 added d
+  |   draft
+  |
+  | o  4:5acd58ef5066 added dh
+  | |   draft
+  | |
+  +---o  3:9150fe93bec6 added d
+  | |     draft
+  | |
+  o |  2:155349b645be added c
+  |/    draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+  $ hg prune 3 -s 4
+  1 changesets pruned
+  $ hg prune 3 -s 5 --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+  $ hg phase --public -r 5
+
+  $ hg glog
+  @  5:e800202333a4 added d
+  |   public
+  |
+  | *  4:5acd58ef5066 added dh
+  | |   draft content-divergent
+  | |
+  o |  2:155349b645be added c
+  |/    public
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+  $ hg evolve --content-divergent --any
+  merge:[5] added d
+  with: [4] added dh
+  base: [3] added d
+  rebasing "other" content-divergent changeset 5acd58ef5066 on 155349b645be
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  other divergent changeset ae3429430ef1 has same content as local e800202333a4 and differs by "description" only, discarding ae3429430ef1
+  content divergence resolution between e800202333a4 (public) and ae3429430ef1 has same content as e800202333a4, discarding ae3429430ef1
+
+  $ hg evolve -l
+
+  $ hg par
+  changeset:   5:e800202333a4
+  tag:         tip
+  parent:      2:155349b645be
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     added d
+  
+  $ cd ..
+
+Testing when same parent, merging conflict:
+-------------------------------------------
+
+  $ hg init pubdiv3
+  $ cd pubdiv3
+  $ for ch in a b c; do
+  >   echo $ch > $ch;
+  >   hg ci -Am "added "$ch;
+  > done;
+  adding a
+  adding b
+  adding c
+
+  $ hg up .^
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo chconflict > ch
+  $ hg add ch
+  $ hg ci -m "added ch"
+  created new head
+
+  $ hg up .^
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo ch > ch
+  $ hg add ch
+  $ hg ci -m "added c"
+  created new head
+
+  $ hg glog
+  @  4:f7c1071f1e7c added c
+  |   draft
+  |
+  | o  3:229da2719b19 added ch
+  |/    draft
+  |
+  | o  2:155349b645be added c
+  |/    draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+  $ hg prune 2 -s 3
+  1 changesets pruned
+  $ hg prune 2 -s 4 --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+  $ hg phase --public -r 4
+
+  $ hg glog
+  @  4:f7c1071f1e7c added c
+  |   public
+  |
+  | *  3:229da2719b19 added ch
+  |/    draft content-divergent
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+  $ hg evolve --content-divergent --any
+  merge:[4] added c
+  with: [3] added ch
+  base: [2] added c
+  merging ch
+  warning: conflicts while merging ch! (edit, then use 'hg resolve --mark')
+  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ hg diff
+  diff -r f7c1071f1e7c ch
+  --- a/ch	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/ch	Thu Jan 01 00:00:00 1970 +0000
+  @@ -1,1 +1,5 @@
+  +<<<<<<< local: f7c1071f1e7c - test: added c
+   ch
+  +=======
+  +chconflict
+  +>>>>>>> other: 229da2719b19 - test: added ch
+
+  $ echo ch > ch
+  $ hg res -m
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  other divergent changeset 229da2719b19 has same content as local f7c1071f1e7c and differs by "description" only, discarding 229da2719b19
+  working directory is now at f7c1071f1e7c
+
+  $ hg evolve -l
+
+  $ hg par
+  changeset:   4:f7c1071f1e7c
+  tag:         tip
+  parent:      1:5f6d8a4bf34a
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     added c
+  
+  $ cd ..
+
+Testing when different parent, relocation conflict:
+---------------------------------------------------
+
+  $ hg init pubdiv4
+  $ cd pubdiv4
+  $ for ch in a b c d; do
+  >   echo $ch > $ch;
+  >   hg ci -Am "added "$ch;
+  > done;
+  adding a
+  adding b
+  adding c
+  adding d
+
+  $ hg up 1
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo dh > dh
+  $ echo cc > c
+  $ hg add dh c
+  $ hg ci -m "added dh"
+  created new head
+
+  $ hg up 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo dh > dh
+  $ hg add dh
+  $ hg ci -m "added d"
+  created new head
+
+  $ hg glog
+  @  5:e800202333a4 added d
+  |   draft
+  |
+  | o  4:f89a8e2f86ac added dh
+  | |   draft
+  | |
+  +---o  3:9150fe93bec6 added d
+  | |     draft
+  | |
+  o |  2:155349b645be added c
+  |/    draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+  $ hg prune 3 -s 4
+  1 changesets pruned
+  $ hg prune 3 -s 5 --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+  $ hg phase --public -r 5
+
+  $ hg glog
+  @  5:e800202333a4 added d
+  |   public
+  |
+  | *  4:f89a8e2f86ac added dh
+  | |   draft content-divergent
+  | |
+  o |  2:155349b645be added c
+  |/    public
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+  $ hg evolve --content-divergent --any
+  merge:[5] added d
+  with: [4] added dh
+  base: [3] added d
+  rebasing "other" content-divergent changeset f89a8e2f86ac on 155349b645be
+  merging c
+  warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ echo c > c
+  $ hg res -m
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  evolving 4:f89a8e2f86ac "added dh"
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  other divergent changeset bc309da55b88 has same content as local e800202333a4 and differs by "description" only, discarding bc309da55b88
+  working directory is now at e800202333a4
+
+  $ hg evolve -l
+
+  $ hg par
+  changeset:   5:e800202333a4
+  tag:         tip
+  parent:      2:155349b645be
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     added d
+  
+  $ cd ..
+
+Testing when different parent, merging conflict:
+------------------------------------------------
+
+  $ hg init pubdiv5
+  $ cd pubdiv5
+  $ for ch in a b c d; do
+  >   echo $ch > $ch;
+  >   hg ci -Am "added "$ch;
+  > done;
+  adding a
+  adding b
+  adding c
+  adding d
+
+  $ hg up 1
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo dhconflict > dh
+  $ hg add dh
+  $ hg ci -m "added dh"
+  created new head
+
+  $ hg up 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo dh > dh
+  $ hg add dh
+  $ hg ci -m "added d"
+  created new head
+
+  $ hg glog
+  @  5:e800202333a4 added d
+  |   draft
+  |
+  | o  4:db0b7bba0aae added dh
+  | |   draft
+  | |
+  +---o  3:9150fe93bec6 added d
+  | |     draft
+  | |
+  o |  2:155349b645be added c
+  |/    draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+  $ hg prune 3 -s 4
+  1 changesets pruned
+  $ hg prune 3 -s 5 --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+  $ hg phase --public -r 5
+
+  $ hg glog
+  @  5:e800202333a4 added d
+  |   public
+  |
+  | *  4:db0b7bba0aae added dh
+  | |   draft content-divergent
+  | |
+  o |  2:155349b645be added c
+  |/    public
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+  $ hg evolve --content-divergent --any
+  merge:[5] added d
+  with: [4] added dh
+  base: [3] added d
+  rebasing "other" content-divergent changeset db0b7bba0aae on 155349b645be
+  merging dh
+  warning: conflicts while merging dh! (edit, then use 'hg resolve --mark')
+  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ echo dh > dh
+  $ hg res -m
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  other divergent changeset a5bbf2042450 has same content as local e800202333a4 and differs by "description" only, discarding a5bbf2042450
+  working directory is now at e800202333a4
+
+  $ hg evolve -l
+
+  $ hg par
+  changeset:   5:e800202333a4
+  tag:         tip
+  parent:      2:155349b645be
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     added d
+  
+  $ cd ..
+
+Testing when different parent, conflict in relocation and merging:
+------------------------------------------------------------------
+
+  $ hg init pubdiv6
+  $ cd pubdiv6
+  $ for ch in a b c d; do
+  >   echo $ch > $ch;
+  >   hg ci -Am "added "$ch;
+  > done;
+  adding a
+  adding b
+  adding c
+  adding d
+
+  $ hg up 1
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo dhconflict > dh
+  $ echo cc > c
+  $ hg add dh c
+  $ hg ci -m "added dh"
+  created new head
+
+  $ hg up 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo dh > dh
+  $ hg add dh
+  $ hg ci -m "added d"
+  created new head
+
+  $ hg glog
+  @  5:e800202333a4 added d
+  |   draft
+  |
+  | o  4:67b19bbd770f added dh
+  | |   draft
+  | |
+  +---o  3:9150fe93bec6 added d
+  | |     draft
+  | |
+  o |  2:155349b645be added c
+  |/    draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+  $ hg prune 3 -s 4
+  1 changesets pruned
+  $ hg prune 3 -s 5 --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+  $ hg phase --public -r 5
+
+  $ hg glog
+  @  5:e800202333a4 added d
+  |   public
+  |
+  | *  4:67b19bbd770f added dh
+  | |   draft content-divergent
+  | |
+  o |  2:155349b645be added c
+  |/    public
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+  $ hg evolve --content-divergent --any
+  merge:[5] added d
+  with: [4] added dh
+  base: [3] added d
+  rebasing "other" content-divergent changeset 67b19bbd770f on 155349b645be
+  merging c
+  warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ echo c > c
+  $ hg res -m
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  evolving 4:67b19bbd770f "added dh"
+  merging dh
+  warning: conflicts while merging dh! (edit, then use 'hg resolve --mark')
+  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ echo dh > dh
+  $ hg res -m
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  other divergent changeset 09054d1f3c97 has same content as local e800202333a4 and differs by "description" only, discarding 09054d1f3c97
+  working directory is now at e800202333a4
+
+  $ hg evolve -l
+
+  $ hg par
+  changeset:   5:e800202333a4
+  tag:         tip
+  parent:      2:155349b645be
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     added d
+  
+  $ cd ..
+
+Testing that we warn the user for the metadata being lost in divergence resolution:
+-----------------------------------------------------------------------------------
+
+  $ hg init pubdiv7
+  $ cd pubdiv7
+  $ for ch in a b c d; do
+  >   echo $ch > $ch;
+  >   hg ci -Am "added "$ch;
+  > done;
+  adding a
+  adding b
+  adding c
+  adding d
+
+  $ echo dada > d
+  $ hg amend
+  $ hg up -r "desc('added c')"
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg branch feature
+  marked working directory as branch feature
+  (branches are permanent and global, did you want a bookmark?)
+  $ echo dada > d
+  $ hg ci -Am "added d"
+  adding d
+  $ hg prune -r "min(desc('added d'))" -s . --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+
+(publish one side)
+  $ hg phase --public
+  $ hg up -r "draft()"
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+(make other divergent a closed branch head)
+  $ hg ci --amend -m "closing feature branch" --close-branch
+
+  $ hg glog
+  @  6:af442315d198 closing feature branch
+  |   draft content-divergent
+  |
+  | o  5:497d0d2b90ba added d
+  |/    public
+  |
+  o  2:155349b645be added c
+  |   public
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+
+Run automatic evolution:
+
+  $ hg evolve --content-divergent
+  merge:[5] added d
+  with: [6] closing feature branch
+  base: [3] added d
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  other divergent changeset af442315d198 is a closed branch head and differs from local 497d0d2b90ba by "branch, description" only, discarding af442315d198
+  content divergence resolution between 497d0d2b90ba (public) and af442315d198 has same content as 497d0d2b90ba, discarding af442315d198
+  working directory is now at 497d0d2b90ba
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-evolve-public-content-divergent-main.t	Wed Jun 05 17:46:06 2019 +0200
@@ -0,0 +1,628 @@
+=============================================================
+Tests the resolution of public content divergence: main cases
+=============================================================
+
+This file intend to cover all the common cases of public content divergence.
+That is all the variant of:
+parent: same/different
+relocation: [no-]conflict
+merging: [no-]conflict
+
+Setup
+=====
+  $ cat >> $HGRCPATH <<EOF
+  > [alias]
+  > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {instabilities}\n\n"
+  > [phases]
+  > publish = False
+  > [extensions]
+  > rebase =
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
+
+Testing when same parent, no conflict:
+--------------------------------------
+
+Prepare the repository:
+
+  $ hg init pubdiv1
+  $ cd pubdiv1
+  $ for ch in a b; do
+  >   echo $ch > $ch;
+  >   hg ci -Aqm "added "$ch;
+  > done;
+  $ hg glog
+  @  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+Make an amend and change phase to public:
+
+  $ sed -i "1 i I am first" b
+  $ hg amend
+  $ hg phase --public
+
+Amend again to create a cset divergent to public one:
+
+  $ hg up 1 --hidden -q
+  updating to a hidden changeset 5f6d8a4bf34a
+  (hidden revision '5f6d8a4bf34a' was rewritten as: 44f360db368f)
+  working directory parent is obsolete! (5f6d8a4bf34a)
+
+  $ echo "I am second" >> b
+  $ hg ci --amend -m "updated b"
+  1 new content-divergent changesets
+
+  $ hg glog
+  @  3:dcdaf152280a updated b
+  |   draft content-divergent
+  |
+  | o  2:44f360db368f added b
+  |/    public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+
+Lets resolve the public content-divergence:
+
+  $ hg evolve --content-divergent
+  merge:[2] added b
+  with: [3] updated b
+  base: [1] added b
+  merging b
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  committed as c1aa9cfb6cf8
+  working directory is now at c1aa9cfb6cf8
+
+Following graph log shows that it correctly merged the two divergent csets:
+
+  $ hg glog -p
+  @  5:c1aa9cfb6cf8 phase-divergent update to 44f360db368f:
+  |   draft
+  |
+  |  diff -r 44f360db368f -r c1aa9cfb6cf8 b
+  |  --- a/b	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -1,2 +1,3 @@
+  |   I am first
+  |   b
+  |  +I am second
+  |
+  o  2:44f360db368f added b
+  |   public
+  |
+  |  diff -r 9092f1db7931 -r 44f360db368f b
+  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
+  |  @@ -0,0 +1,2 @@
+  |  +I am first
+  |  +b
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+     diff -r 000000000000 -r 9092f1db7931 a
+     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
+     @@ -0,0 +1,1 @@
+     +a
+  
+  $ hg evolve -l
+  $ cd ..
+
+Testing when same parent, merging conflict:
+-------------------------------------------
+
+Prepare the repository:
+
+  $ hg init pubdiv2
+  $ cd pubdiv2
+  $ for ch in a b; do
+  >   echo $ch > $ch;
+  >   hg ci -Aqm "added "$ch;
+  > done;
+  $ hg glog
+  @  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+Make an amend and change phase to public:
+
+  $ echo "I am foo" > b
+  $ hg amend
+  $ hg phase --public
+
+Amend again to create a cset divergent to public one:
+
+  $ hg up 1 --hidden -q
+  updating to a hidden changeset 5f6d8a4bf34a
+  (hidden revision '5f6d8a4bf34a' was rewritten as: 580f2d01e52c)
+  working directory parent is obsolete! (5f6d8a4bf34a)
+
+  $ echo "I am bar" > b
+  $ hg ci --amend -m "updated b"
+  1 new content-divergent changesets
+
+  $ hg glog
+  @  3:0e805383168e updated b
+  |   draft content-divergent
+  |
+  | o  2:580f2d01e52c added b
+  |/    public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+
+Lets resolve the divergence:
+
+  $ hg evolve --content-divergent
+  merge:[2] added b
+  with: [3] updated b
+  base: [1] added b
+  merging b
+  warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
+  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ echo "I am foobar" > b
+  $ hg resolve -m --tool union
+  (no more unresolved files)
+  continue: hg evolve --continue
+  $ hg evolve --continue
+  committed as 1a739394e9d4
+  working directory is now at 1a739394e9d4
+
+  $ hg glog
+  @  5:1a739394e9d4 phase-divergent update to 580f2d01e52c:
+  |   draft
+  |
+  o  2:580f2d01e52c added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+Testing when different parent, no conflict:
+-------------------------------------------
+
+  $ hg init pubdiv3
+  $ cd pubdiv3
+  $ for ch in a b c d; do
+  >   echo $ch > $ch;
+  >   hg ci -Aqm "added "$ch;
+  > done;
+
+  $ hg up .^
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo dd > d
+  $ hg add d
+  $ hg ci -m "added d"
+  created new head
+
+  $ hg up 1
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo dd > d
+  $ echo e > e
+  $ hg add d e
+  $ hg ci -m "added d e"
+  created new head
+
+  $ hg glog
+  @  5:4291d72ee19a added d e
+  |   draft
+  |
+  | o  4:93cd84bbdaca added d
+  | |   draft
+  | |
+  | | o  3:9150fe93bec6 added d
+  | |/    draft
+  | |
+  | o  2:155349b645be added c
+  |/    draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+
+  $ hg prune 3 -s 5
+  1 changesets pruned
+  $ hg prune 3 -s 4 --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+
+Change phase to public for one head:
+  $ hg phase -r 4 --public
+
+  $ hg glog
+  @  5:4291d72ee19a added d e
+  |   draft content-divergent
+  |
+  | o  4:93cd84bbdaca added d
+  | |   public
+  | |
+  | o  2:155349b645be added c
+  |/    public
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+
+  $ hg evolve --content-divergent --any
+  merge:[4] added d
+  with: [5] added d e
+  base: [3] added d
+  rebasing "other" content-divergent changeset 4291d72ee19a on 155349b645be
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  committed as 4cbe48a0c3d9
+  working directory is now at 4cbe48a0c3d9
+
+  $ hg glog -l 1
+  @  8:4cbe48a0c3d9 phase-divergent update to 93cd84bbdaca:
+  |   draft
+  ~
+
+  $ hg evolve -l
+  $ cd ..
+
+Testing when different parents, relocation conflict:
+----------------------------------------------------
+
+  $ hg init pubdiv4
+  $ cd pubdiv4
+  $ for ch in a b c d; do
+  >   echo $ch > $ch;
+  >   hg ci -Aqm "added "$ch;
+  > done;
+
+  $ hg up .^^
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo d > d
+  $ echo cfoo > c
+  $ echo e > e
+  $ hg add d c e
+  $ hg ci -m "added d c e"
+  created new head
+
+  $ hg up 'desc("added c")'
+  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo dd > d
+  $ hg add d
+  $ hg ci -m "added d"
+  created new head
+
+  $ hg glog
+  @  5:93cd84bbdaca added d
+  |   draft
+  |
+  | o  4:f31bcc378766 added d c e
+  | |   draft
+  | |
+  +---o  3:9150fe93bec6 added d
+  | |     draft
+  | |
+  o |  2:155349b645be added c
+  |/    draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+  $ hg prune 'min(desc("re:added d$"))' -s 'max(desc("re:added d$"))'
+  1 changesets pruned
+  $ hg prune 'min(desc("re:added d$"))' -s 'desc("added d c e")' --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+
+Change phase to public for one head:
+  $ hg phase --public -r 'max(desc("re:added d$"))'
+
+  $ hg glog
+  @  5:93cd84bbdaca added d
+  |   public
+  |
+  | *  4:f31bcc378766 added d c e
+  | |   draft content-divergent
+  | |
+  o |  2:155349b645be added c
+  |/    public
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+  $ hg evolve --content-divergent --any --update
+  merge:[5] added d
+  with: [4] added d c e
+  base: [3] added d
+  rebasing "other" content-divergent changeset f31bcc378766 on 155349b645be
+  merging c
+  warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ hg diff
+  diff -r 155349b645be c
+  --- a/c	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  @@ -1,1 +1,5 @@
+  +<<<<<<< destination: 155349b645be - test: added c
+   c
+  +=======
+  +cfoo
+  +>>>>>>> evolving:    f31bcc378766 - test: added d c e
+  diff -r 155349b645be d
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,1 @@
+  +d
+  diff -r 155349b645be e
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,1 @@
+  +e
+
+  $ echo c > c
+  $ hg res -m
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  evolving 4:f31bcc378766 "added d c e"
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  committed as 412dde898967
+  working directory is now at 412dde898967
+  $ hg export
+  # HG changeset patch
+  # User test
+  # Date 0 0
+  #      Thu Jan 01 00:00:00 1970 +0000
+  # Node ID 412dde898967b50e7d334aefff778a9af46d29d1
+  # Parent  93cd84bbdacaeb8f881c29a609dbdd30c38cbc57
+  phase-divergent update to 93cd84bbdaca:
+  
+  added d c e
+  
+  diff -r 93cd84bbdaca -r 412dde898967 e
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,1 @@
+  +e
+
+  $ hg evolve -l
+  $ cd ..
+
+Testing when merging conflicts, relocation don't:
+-------------------------------------------------
+
+  $ hg init pubdiv5
+  $ cd pubdiv5
+  $ for ch in a b c d; do
+  >   echo $ch > $ch;
+  >   hg ci -Aqm "added "$ch;
+  > done;
+
+  $ hg up .^^
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo dconflict > d
+  $ hg add d
+  $ hg ci -m "added d"
+  created new head
+
+  $ hg up 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo dd > d
+  $ hg add d
+  $ hg ci -m "added d"
+  created new head
+
+  $ hg glog
+  @  5:93cd84bbdaca added d
+  |   draft
+  |
+  | o  4:9411ad1fe615 added d
+  | |   draft
+  | |
+  +---o  3:9150fe93bec6 added d
+  | |     draft
+  | |
+  o |  2:155349b645be added c
+  |/    draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+  $ hg prune 3 -s 5
+  1 changesets pruned
+  $ hg prune 3 -s 4 --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+
+Change phase to public for one head:
+  $ hg phase --public -r 5
+
+  $ hg glog
+  @  5:93cd84bbdaca added d
+  |   public
+  |
+  | *  4:9411ad1fe615 added d
+  | |   draft content-divergent
+  | |
+  o |  2:155349b645be added c
+  |/    public
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+  $ hg evolve --content-divergent --any
+  merge:[5] added d
+  with: [4] added d
+  base: [3] added d
+  rebasing "other" content-divergent changeset 9411ad1fe615 on 155349b645be
+  merging d
+  warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
+  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ echo d > d
+  $ hg res -m
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  committed as 2a0f44767904
+  working directory is now at 93cd84bbdaca
+
+  $ hg evolve -l
+  $ cd ..
+
+Testing when relocation, merging both conflict:
+-----------------------------------------------
+
+  $ hg init pubdiv6
+  $ cd pubdiv6
+  $ for ch in a b c d; do
+  >   echo $ch > $ch;
+  >   hg ci -Aqm "added "$ch;
+  > done;
+
+  $ hg up .^^
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo cfoo > c
+  $ echo e > e
+  $ echo dconflict > d
+  $ hg add c e d
+  $ hg ci -m "added c e"
+  created new head
+
+  $ hg up 2
+  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo dd > d
+  $ hg add d
+  $ hg ci -m "added d"
+  created new head
+
+  $ hg glog
+  @  5:93cd84bbdaca added d
+  |   draft
+  |
+  | o  4:3c17c7afaf6e added c e
+  | |   draft
+  | |
+  +---o  3:9150fe93bec6 added d
+  | |     draft
+  | |
+  o |  2:155349b645be added c
+  |/    draft
+  |
+  o  1:5f6d8a4bf34a added b
+  |   draft
+  |
+  o  0:9092f1db7931 added a
+      draft
+  
+  $ hg prune 3 -s 5
+  1 changesets pruned
+  $ hg prune 3 -s 4 --hidden
+  1 changesets pruned
+  2 new content-divergent changesets
+
+Change phase to public for one head:
+  $ hg phase --public -r 5
+
+  $ hg glog
+  @  5:93cd84bbdaca added d
+  |   public
+  |
+  | *  4:3c17c7afaf6e added c e
+  | |   draft content-divergent
+  | |
+  o |  2:155349b645be added c
+  |/    public
+  |
+  o  1:5f6d8a4bf34a added b
+  |   public
+  |
+  o  0:9092f1db7931 added a
+      public
+  
+  $ hg evolve --content-divergent --any
+  merge:[5] added d
+  with: [4] added c e
+  base: [3] added d
+  rebasing "other" content-divergent changeset 3c17c7afaf6e on 155349b645be
+  merging c
+  warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ hg diff
+  diff -r 155349b645be c
+  --- a/c	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
+  @@ -1,1 +1,5 @@
+  +<<<<<<< destination: 155349b645be - test: added c
+   c
+  +=======
+  +cfoo
+  +>>>>>>> evolving:    3c17c7afaf6e - test: added c e
+  diff -r 155349b645be d
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,1 @@
+  +dconflict
+  diff -r 155349b645be e
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,1 @@
+  +e
+
+  $ echo cfoo > c
+  $ hg res -m
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  evolving 4:3c17c7afaf6e "added c e"
+  merging d
+  warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
+  2 files updated, 0 files merged, 0 files removed, 1 files unresolved
+  fix conflicts and see `hg help evolve.interrupted`
+  [1]
+
+  $ echo d > d
+  $ hg res -m
+  (no more unresolved files)
+  continue: hg evolve --continue
+
+  $ hg evolve --continue
+  committed as b9082a9e66ce
+  working directory is now at 93cd84bbdaca
+
+  $ hg evolve -l
+  $ cd ..
--- a/tests/test-evolve-public-content-divergent.t	Tue Apr 23 14:18:11 2019 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2016 +0,0 @@
-Test for handling of content divergence with public cset using `hg evolve`
-==========================================================================
-
-Setup
-=====
-  $ cat >> $HGRCPATH <<EOF
-  > [alias]
-  > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {troubles}\n\n"
-  > [phases]
-  > publish = False
-  > [extensions]
-  > rebase =
-  > EOF
-  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
-
-Testing the case when both divergent cset are on the same parent and no-conflict in merging:
--------------------------------------------------------------------------------------
-
-Prepare the repository:
-
-  $ hg init pubdiv
-  $ cd pubdiv
-  $ for ch in a b; do
-  >   echo $ch > $ch;
-  >   hg ci -Aqm "added "$ch;
-  > done;
-  $ hg glog
-  @  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-Make an amend and change phase to public:
-
-  $ sed -i "1 i I am first" b
-  $ hg amend
-  $ hg phase --public
-
-Amend again to create a cset divergent to public one:
-
-  $ hg up 1 --hidden -q
-  updating to a hidden changeset 5f6d8a4bf34a
-  (hidden revision '5f6d8a4bf34a' was rewritten as: 44f360db368f)
-  working directory parent is obsolete! (5f6d8a4bf34a)
-
-  $ echo "I am second" >> b
-  $ hg ci --amend -m "updated b"
-  1 new content-divergent changesets
-
-  $ hg glog
-  @  3:dcdaf152280a updated b
-  |   draft content-divergent
-  |
-  | o  2:44f360db368f added b
-  |/    public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-
-Lets resolve the public content-divergence:
-
-  $ hg evolve --content-divergent
-  merge:[2] added b
-  with: [3] updated b
-  base: [1] added b
-  updating to "local" side of the conflict: 44f360db368f
-  merging "other" content-divergent changeset 'dcdaf152280a'
-  merging b
-  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
-  committed as c1aa9cfb6cf8
-  working directory is now at c1aa9cfb6cf8
-
-Following graph log shows that it correctly merged the two divergent csets:
-
-  $ hg glog -p
-  @  5:c1aa9cfb6cf8 phase-divergent update to 44f360db368f:
-  |   draft
-  |
-  |  diff -r 44f360db368f -r c1aa9cfb6cf8 b
-  |  --- a/b	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -1,2 +1,3 @@
-  |   I am first
-  |   b
-  |  +I am second
-  |
-  o  2:44f360db368f added b
-  |   public
-  |
-  |  diff -r 9092f1db7931 -r 44f360db368f b
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,2 @@
-  |  +I am first
-  |  +b
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-     diff -r 000000000000 -r 9092f1db7931 a
-     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
-     @@ -0,0 +1,1 @@
-     +a
-  
-  $ hg evolve -l
-
-  $ cd ..
-
-Testing the case when both divergent cset has same parent and has conflict in merging:
-------------------------------------------------------------------------------
-
-Prepare the repository:
-
-  $ hg init pubdiv1
-  $ cd pubdiv1
-  $ for ch in a b; do
-  >   echo $ch > $ch;
-  >   hg ci -Aqm "added "$ch;
-  > done;
-  $ hg glog
-  @  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-Make an amend and change phase to public:
-
-  $ echo "I am foo" > b
-  $ hg amend
-  $ hg phase --public
-
-Amend again to create a cset divergent to public one:
-
-  $ hg up 1 --hidden -q
-  updating to a hidden changeset 5f6d8a4bf34a
-  (hidden revision '5f6d8a4bf34a' was rewritten as: 580f2d01e52c)
-  working directory parent is obsolete! (5f6d8a4bf34a)
-
-  $ echo "I am bar" > b
-  $ hg ci --amend -m "updated b"
-  1 new content-divergent changesets
-
-  $ hg glog
-  @  3:0e805383168e updated b
-  |   draft content-divergent
-  |
-  | o  2:580f2d01e52c added b
-  |/    public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-
-Lets resolve the divergence:
-
-  $ hg evolve --content-divergent
-  merge:[2] added b
-  with: [3] updated b
-  base: [1] added b
-  updating to "local" side of the conflict: 580f2d01e52c
-  merging "other" content-divergent changeset '0e805383168e'
-  merging b
-  warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
-  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ echo "I am foobar" > b
-  $ hg resolve -m --tool union
-  (no more unresolved files)
-  continue: hg evolve --continue
-  $ hg evolve --continue
-  committed as 1a739394e9d4
-  working directory is now at 1a739394e9d4
-
-  $ hg glog
-  @  5:1a739394e9d4 phase-divergent update to 580f2d01e52c:
-  |   draft
-  |
-  o  2:580f2d01e52c added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-Testing the case when divergence is not created by actual diff change, but because of rebasing:
-------------------------------------------------------------------------------------------------
-
-Prepare the repo:
-
-  $ cd ..
-  $ hg init rebasediv
-  $ cd rebasediv
-  $ for ch in a b c; do
-  >   echo $ch > $ch;
-  >   hg ci -Am "added "$ch;
-  > done;
-  adding a
-  adding b
-  adding c
-
-  $ hg glog
-  @  2:155349b645be added c
-  |   draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-On server side: a new cset is added based on rev 1 and rev 2 is rebased on newly added cset:
-
-  $ hg up .^ -q
-  $ echo d > d
-  $ hg ci -Am "added d"
-  adding d
-  created new head
-
-  $ hg rebase -r 2 -d .
-  rebasing 2:155349b645be "added c"
-
-  $ hg glog
-  o  4:c0d7ee6604ea added c
-  |   draft
-  |
-  @  3:c9241b0f2d5b added d
-  |   draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-On user side: user has not pulled yet and amended the rev 2 which created the divergence after pull:
-  $ hg up 2 --hidden -q
-  updating to a hidden changeset 155349b645be
-  (hidden revision '155349b645be' was rewritten as: c0d7ee6604ea)
-  working directory parent is obsolete! (155349b645be)
-
-  $ echo cc >> c
-  $ hg ci --amend -m "updated c"
-  2 new content-divergent changesets
-
-Lets change the phase to --public of branch which is pulled from server:
-  $ hg phase --public -r 4
-  $ hg glog -p
-  @  5:f5f9b4fc8b77 updated c
-  |   draft content-divergent
-  |
-  |  diff -r 5f6d8a4bf34a -r f5f9b4fc8b77 c
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,2 @@
-  |  +c
-  |  +cc
-  |
-  | o  4:c0d7ee6604ea added c
-  | |   public
-  | |
-  | |  diff -r c9241b0f2d5b -r c0d7ee6604ea c
-  | |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  | |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  | |  @@ -0,0 +1,1 @@
-  | |  +c
-  | |
-  | o  3:c9241b0f2d5b added d
-  |/    public
-  |
-  |    diff -r 5f6d8a4bf34a -r c9241b0f2d5b d
-  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |    +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-  |    @@ -0,0 +1,1 @@
-  |    +d
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  |  diff -r 9092f1db7931 -r 5f6d8a4bf34a b
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +b
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-     diff -r 000000000000 -r 9092f1db7931 a
-     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
-     @@ -0,0 +1,1 @@
-     +a
-  
-
-Evolve:
-  $ hg evolve --content-divergent
-  merge:[4] added c
-  with: [5] updated c
-  base: [2] added c
-  rebasing "other" content-divergent changeset f5f9b4fc8b77 on c9241b0f2d5b
-  updating to "local" side of the conflict: c0d7ee6604ea
-  merging "other" content-divergent changeset 'c3d442d80993'
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  committed as 3b336cbee992
-  working directory is now at 3b336cbee992
-
-  $ hg glog -p
-  @  8:3b336cbee992 phase-divergent update to c0d7ee6604ea:
-  |   draft
-  |
-  |  diff -r c0d7ee6604ea -r 3b336cbee992 c
-  |  --- a/c	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -1,1 +1,2 @@
-  |   c
-  |  +cc
-  |
-  o  4:c0d7ee6604ea added c
-  |   public
-  |
-  |  diff -r c9241b0f2d5b -r c0d7ee6604ea c
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c
-  |
-  o  3:c9241b0f2d5b added d
-  |   public
-  |
-  |  diff -r 5f6d8a4bf34a -r c9241b0f2d5b d
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +d
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  |  diff -r 9092f1db7931 -r 5f6d8a4bf34a b
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +b
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-     diff -r 000000000000 -r 9092f1db7931 a
-     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
-     @@ -0,0 +1,1 @@
-     +a
-  
-Check that we don't have any unstable cset now:
-  $ hg evolve -l
-  $ cd ..
-
-Testing the case when csets are on different parent and no conflict in relocation and merging:
-----------------------------------------------------------------------------------------------
-
-  $ hg init pubdiv2
-  $ cd pubdiv2
-  $ for ch in a b c d; do
-  >   echo $ch > $ch;
-  >   hg ci -Aqm "added "$ch;
-  > done;
-
-  $ hg up .^
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo dd > d
-  $ hg add d
-  $ hg ci -m "added d"
-  created new head
-
-  $ hg up 1
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo dd > d
-  $ echo e > e
-  $ hg add d e
-  $ hg ci -m "added d e"
-  created new head
-
-  $ hg glog
-  @  5:4291d72ee19a added d e
-  |   draft
-  |
-  | o  4:93cd84bbdaca added d
-  | |   draft
-  | |
-  | | o  3:9150fe93bec6 added d
-  | |/    draft
-  | |
-  | o  2:155349b645be added c
-  |/    draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-  $ hg prune 3 -s 5
-  1 changesets pruned
-  $ hg prune 3 -s 4 --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-
-Change phase to public for one head:
-  $ hg phase -r 4 --public
-
-  $ hg glog
-  @  5:4291d72ee19a added d e
-  |   draft content-divergent
-  |
-  | o  4:93cd84bbdaca added d
-  | |   public
-  | |
-  | o  2:155349b645be added c
-  |/    public
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-
-  $ hg evolve --content-divergent --any
-  merge:[4] added d
-  with: [5] added d e
-  base: [3] added d
-  rebasing "other" content-divergent changeset 4291d72ee19a on 155349b645be
-  updating to "local" side of the conflict: 93cd84bbdaca
-  merging "other" content-divergent changeset 'f88581407163'
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  committed as 4cbe48a0c3d9
-  working directory is now at 4cbe48a0c3d9
-
-  $ hg glog -l 1
-  @  8:4cbe48a0c3d9 phase-divergent update to 93cd84bbdaca:
-  |   draft
-  ~
-
-  $ hg evolve -l
-  $ cd ..
-
-Different parents, relocation conflict
---------------------------------------
-
-Testing the case when csets are on different parent and conflict in relocation
-but not in merging.
-
-  $ hg init pubdiv3
-  $ cd pubdiv3
-  $ for ch in a b c d; do
-  >   echo $ch > $ch;
-  >   hg ci -Aqm "added "$ch;
-  > done;
-
-  $ hg up .^^
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo d > d
-  $ echo cfoo > c
-  $ echo e > e
-  $ hg add d c e
-  $ hg ci -m "added d c e"
-  created new head
-
-  $ hg up 'desc("added c")'
-  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo dd > d
-  $ hg add d
-  $ hg ci -m "added d"
-  created new head
-
-  $ hg glog
-  @  5:93cd84bbdaca added d
-  |   draft
-  |
-  | o  4:f31bcc378766 added d c e
-  | |   draft
-  | |
-  +---o  3:9150fe93bec6 added d
-  | |     draft
-  | |
-  o |  2:155349b645be added c
-  |/    draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-  $ hg prune 'min(desc("re:added d$"))' -s 'max(desc("re:added d$"))'
-  1 changesets pruned
-  $ hg prune 'min(desc("re:added d$"))' -s 'desc("added d c e")' --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-
-Change phase to public for one head:
-  $ hg phase --public -r 'max(desc("re:added d$"))'
-
-  $ hg glog
-  @  5:93cd84bbdaca added d
-  |   public
-  |
-  | *  4:f31bcc378766 added d c e
-  | |   draft content-divergent
-  | |
-  o |  2:155349b645be added c
-  |/    public
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-  $ hg evolve --content-divergent --any
-  merge:[5] added d
-  with: [4] added d c e
-  base: [3] added d
-  rebasing "other" content-divergent changeset f31bcc378766 on 155349b645be
-  merging c
-  warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ hg diff
-  diff -r 155349b645be c
-  --- a/c	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  @@ -1,1 +1,5 @@
-  +<<<<<<< destination: 155349b645be - test: added c
-   c
-  +=======
-  +cfoo
-  +>>>>>>> evolving:    f31bcc378766 - test: added d c e
-  diff -r 155349b645be d
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +d
-  diff -r 155349b645be e
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +e
-
-  $ echo c > c
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  evolving 4:f31bcc378766 "added d c e"
-  updating to "local" side of the conflict: 93cd84bbdaca
-  merging "other" content-divergent changeset 'bd28d3e4a228'
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  committed as 412dde898967
-  working directory is now at 412dde898967
-  $ hg export
-  # HG changeset patch
-  # User test
-  # Date 0 0
-  #      Thu Jan 01 00:00:00 1970 +0000
-  # Node ID 412dde898967b50e7d334aefff778a9af46d29d1
-  # Parent  93cd84bbdacaeb8f881c29a609dbdd30c38cbc57
-  phase-divergent update to 93cd84bbdaca:
-  
-  added d c e
-  
-  diff -r 93cd84bbdaca -r 412dde898967 e
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +e
-
-  $ hg evolve -l
-  $ cd ..
-
-Testing the case when merging leads to conflicts but relocation won't:
----------------------------------------------------------------------
-
-  $ hg init pubdiv3.5
-  $ cd pubdiv3.5
-  $ for ch in a b c d; do
-  >   echo $ch > $ch;
-  >   hg ci -Aqm "added "$ch;
-  > done;
-
-  $ hg up .^^
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo dconflict > d
-  $ hg add d
-  $ hg ci -m "added d"
-  created new head
-
-  $ hg up 2
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo dd > d
-  $ hg add d
-  $ hg ci -m "added d"
-  created new head
-
-  $ hg glog
-  @  5:93cd84bbdaca added d
-  |   draft
-  |
-  | o  4:9411ad1fe615 added d
-  | |   draft
-  | |
-  +---o  3:9150fe93bec6 added d
-  | |     draft
-  | |
-  o |  2:155349b645be added c
-  |/    draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-  $ hg prune 3 -s 5
-  1 changesets pruned
-  $ hg prune 3 -s 4 --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-
-Change phase to public for one head:
-  $ hg phase --public -r 5
-
-  $ hg glog
-  @  5:93cd84bbdaca added d
-  |   public
-  |
-  | *  4:9411ad1fe615 added d
-  | |   draft content-divergent
-  | |
-  o |  2:155349b645be added c
-  |/    public
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-  $ hg evolve --content-divergent --any
-  merge:[5] added d
-  with: [4] added d
-  base: [3] added d
-  rebasing "other" content-divergent changeset 9411ad1fe615 on 155349b645be
-  updating to "local" side of the conflict: 93cd84bbdaca
-  merging "other" content-divergent changeset 'b5c690cdf1d5'
-  merging d
-  warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
-  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ echo d > d
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  committed as 2a0f44767904
-  working directory is now at 2a0f44767904
-
-  $ hg evolve -l
-  $ cd ..
-
-Testing the case when relocation and merging both leads to conflicts:
---------------------------------------------------------------------
-
-  $ hg init pubdiv4
-  $ cd pubdiv4
-  $ for ch in a b c d; do
-  >   echo $ch > $ch;
-  >   hg ci -Aqm "added "$ch;
-  > done;
-
-  $ hg up .^^
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo cfoo > c
-  $ echo e > e
-  $ echo dconflict > d
-  $ hg add c e d
-  $ hg ci -m "added c e"
-  created new head
-
-  $ hg up 2
-  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo dd > d
-  $ hg add d
-  $ hg ci -m "added d"
-  created new head
-
-  $ hg glog
-  @  5:93cd84bbdaca added d
-  |   draft
-  |
-  | o  4:3c17c7afaf6e added c e
-  | |   draft
-  | |
-  +---o  3:9150fe93bec6 added d
-  | |     draft
-  | |
-  o |  2:155349b645be added c
-  |/    draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-  $ hg prune 3 -s 5
-  1 changesets pruned
-  $ hg prune 3 -s 4 --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-
-Change phase to public for one head:
-  $ hg phase --public -r 5
-
-  $ hg glog
-  @  5:93cd84bbdaca added d
-  |   public
-  |
-  | *  4:3c17c7afaf6e added c e
-  | |   draft content-divergent
-  | |
-  o |  2:155349b645be added c
-  |/    public
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-  $ hg evolve --content-divergent --any
-  merge:[5] added d
-  with: [4] added c e
-  base: [3] added d
-  rebasing "other" content-divergent changeset 3c17c7afaf6e on 155349b645be
-  merging c
-  warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ hg diff
-  diff -r 155349b645be c
-  --- a/c	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  @@ -1,1 +1,5 @@
-  +<<<<<<< destination: 155349b645be - test: added c
-   c
-  +=======
-  +cfoo
-  +>>>>>>> evolving:    3c17c7afaf6e - test: added c e
-  diff -r 155349b645be d
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +dconflict
-  diff -r 155349b645be e
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +e
-
-  $ echo cfoo > c
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  evolving 4:3c17c7afaf6e "added c e"
-  updating to "local" side of the conflict: 93cd84bbdaca
-  merging "other" content-divergent changeset 'c4ce3d34e784'
-  merging d
-  warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
-  2 files updated, 0 files merged, 0 files removed, 1 files unresolved
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ echo d > d
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  committed as b9082a9e66ce
-  working directory is now at b9082a9e66ce
-
-  $ hg evolve -l
-  $ cd ..
-
-Different parent, simple conflict on relocate, deleted file on actual merge
----------------------------------------------------------------------------
-
-Changeset "added c e" is also removing 'd'. This should conflict with the update
-to 'd' in the successors of 'adding d' when solving the content divergence.
-
-  $ hg init pubdiv-parent-deleted-file
-  $ cd pubdiv-parent-deleted-file
-  $ for ch in a b c d; do
-  >   echo $ch > $ch;
-  >   hg ci -Aqm "added "$ch;
-  > done;
-
-  $ hg up 'desc("added b")'
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo cfoo > c
-  $ echo e > e
-  $ hg add c e
-  $ hg ci -m "added c e"
-  created new head
-
-  $ hg up 'desc("re:added c$")'
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo dd > d
-  $ hg add d
-  $ hg ci -m "added d"
-  created new head
-
-  $ hg glog --patch --rev 'sort(all(), "topo")'
-  @  5:93cd84bbdaca added d
-  |   draft
-  |
-  |  diff -r 155349b645be -r 93cd84bbdaca d
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +dd
-  |
-  | o  3:9150fe93bec6 added d
-  |/    draft
-  |
-  |    diff -r 155349b645be -r 9150fe93bec6 d
-  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |    +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-  |    @@ -0,0 +1,1 @@
-  |    +d
-  |
-  o  2:155349b645be added c
-  |   draft
-  |
-  |  diff -r 5f6d8a4bf34a -r 155349b645be c
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c
-  |
-  | o  4:e568fd1029bb added c e
-  |/    draft
-  |
-  |    diff -r 5f6d8a4bf34a -r e568fd1029bb c
-  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |    +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  |    @@ -0,0 +1,1 @@
-  |    +cfoo
-  |    diff -r 5f6d8a4bf34a -r e568fd1029bb e
-  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |    +++ b/e	Thu Jan 01 00:00:00 1970 +0000
-  |    @@ -0,0 +1,1 @@
-  |    +e
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  |  diff -r 9092f1db7931 -r 5f6d8a4bf34a b
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +b
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-     diff -r 000000000000 -r 9092f1db7931 a
-     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
-     @@ -0,0 +1,1 @@
-     +a
-  
-  $ hg prune 'min(desc("added d"))' -s 'max(desc("added d"))'
-  1 changesets pruned
-  $ hg prune 'min(desc("added d"))' -s 'desc("added c e")' --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-
-Change phase to public for one head:
-  $ hg phase --public -r 'max(desc("added d"))'
-
-  $ hg glog
-  @  5:93cd84bbdaca added d
-  |   public
-  |
-  | *  4:e568fd1029bb added c e
-  | |   draft content-divergent
-  | |
-  o |  2:155349b645be added c
-  |/    public
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-
-  $ hg glog --patch --rev 'sort(all(), "topo")' --hidden
-  @  5:93cd84bbdaca added d
-  |   public
-  |
-  |  diff -r 155349b645be -r 93cd84bbdaca d
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +dd
-  |
-  | x  3:9150fe93bec6 added d
-  |/    draft
-  |
-  |    diff -r 155349b645be -r 9150fe93bec6 d
-  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |    +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-  |    @@ -0,0 +1,1 @@
-  |    +d
-  |
-  o  2:155349b645be added c
-  |   public
-  |
-  |  diff -r 5f6d8a4bf34a -r 155349b645be c
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c
-  |
-  | *  4:e568fd1029bb added c e
-  |/    draft content-divergent
-  |
-  |    diff -r 5f6d8a4bf34a -r e568fd1029bb c
-  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |    +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  |    @@ -0,0 +1,1 @@
-  |    +cfoo
-  |    diff -r 5f6d8a4bf34a -r e568fd1029bb e
-  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |    +++ b/e	Thu Jan 01 00:00:00 1970 +0000
-  |    @@ -0,0 +1,1 @@
-  |    +e
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  |  diff -r 9092f1db7931 -r 5f6d8a4bf34a b
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +b
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-     diff -r 000000000000 -r 9092f1db7931 a
-     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-     +++ b/a	Thu Jan 01 00:00:00 1970 +0000
-     @@ -0,0 +1,1 @@
-     +a
-  
-
-  $ hg obslog --all --rev tip --patch
-  @  93cd84bbdaca (5) added d
-  |
-  | *  e568fd1029bb (4) added c e
-  |/
-  x  9150fe93bec6 (3) added d
-       rewritten(content) as 93cd84bbdaca using prune by test (Thu Jan 01 00:00:00 1970 +0000)
-         diff -r 9150fe93bec6 -r 93cd84bbdaca d
-         --- a/d	Thu Jan 01 00:00:00 1970 +0000
-         +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-         @@ -1,1 +1,1 @@
-         -d
-         +dd
-  
-       rewritten(description, parent, content) as e568fd1029bb using prune by test (Thu Jan 01 00:00:00 1970 +0000)
-         (No patch available, changesets rebased)
-  
-
-  $ hg evolve --content-divergent --any
-  merge:[5] added d
-  with: [4] added c e
-  base: [3] added d
-  rebasing "other" content-divergent changeset e568fd1029bb on 155349b645be
-  merging c
-  warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ hg diff
-  diff -r 155349b645be c
-  --- a/c	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/c	Thu Jan 01 00:00:00 1970 +0000
-  @@ -1,1 +1,5 @@
-  +<<<<<<< destination: 155349b645be - test: added c
-   c
-  +=======
-  +cfoo
-  +>>>>>>> evolving:    e568fd1029bb - test: added c e
-  diff -r 155349b645be e
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +e
-
-  $ echo c > c
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  evolving 4:e568fd1029bb "added c e"
-  updating to "local" side of the conflict: 93cd84bbdaca
-  merging "other" content-divergent changeset '2af3359250d3'
-  local changed d which other deleted
-  use (c)hanged version, (d)elete, or leave (u)nresolved? u
-  1 files updated, 0 files merged, 0 files removed, 1 files unresolved
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ hg sum
-  parent: 5:93cd84bbdaca 
-   added d
-  parent: 6:2af3359250d3 tip (content-divergent)
-   added c e
-  branch: default
-  commit: 1 modified, 1 unknown, 1 unresolved (merge)
-  update: (current)
-  phases: 1 draft
-  content-divergent: 1 changesets
-  evolve: (evolve --continue)
-
-  $ echo resolved > d
-  $ hg resolve -m d
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  committed as bc1f4610744c
-  working directory is now at bc1f4610744c
-
-  $ hg export
-  # HG changeset patch
-  # User test
-  # Date 0 0
-  #      Thu Jan 01 00:00:00 1970 +0000
-  # Node ID bc1f4610744c6aa0e851d3876a61bfff6243b31c
-  # Parent  93cd84bbdacaeb8f881c29a609dbdd30c38cbc57
-  phase-divergent update to 93cd84bbdaca:
-  
-  added c e
-  
-  diff -r 93cd84bbdaca -r bc1f4610744c d
-  --- a/d	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/d	Thu Jan 01 00:00:00 1970 +0000
-  @@ -1,1 +1,1 @@
-  -dd
-  +resolved
-  diff -r 93cd84bbdaca -r bc1f4610744c e
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/e	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +e
-
-  $ hg evolve -l
-  $ cd ..
-
-Testing the case when "merging results in same as public cset" where:
-both the csets are on same parent and no conflict in merging.
----------------------------------------------------------------------
-
-Prepare the repo:
-
-  $ hg init pubdiv5
-  $ cd pubdiv5
-  $ for ch in a b c; do
-  >   echo $ch > $ch;
-  >   hg ci -Am "added "$ch;
-  > done;
-  adding a
-  adding b
-  adding c
-
-  $ hg up .^
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo ch > ch
-  $ hg add ch
-  $ hg ci -m "added ch"
-  created new head
-
-  $ hg up .^
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo ch > ch
-  $ hg add ch
-  $ hg ci -m "added c"
-  created new head
-
-  $ hg glog
-  @  4:f7c1071f1e7c added c
-  |   draft
-  |
-  | o  3:90522bccf499 added ch
-  |/    draft
-  |
-  | o  2:155349b645be added c
-  |/    draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-  $ hg prune 2 -s 3
-  1 changesets pruned
-  $ hg prune 2 -s 4 --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-  $ hg phase --public -r 4
-
-  $ hg glog
-  @  4:f7c1071f1e7c added c
-  |   public
-  |
-  | *  3:90522bccf499 added ch
-  |/    draft content-divergent
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-  $ hg evolve --content-divergent --any
-  merge:[4] added c
-  with: [3] added ch
-  base: [2] added c
-  merging "other" content-divergent changeset '90522bccf499'
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  content-divergent changesets differ by descriptions only, discarding 90522bccf499
-
-  $ hg evolve -l
-
-  $ hg par
-  changeset:   4:f7c1071f1e7c
-  tag:         tip
-  parent:      1:5f6d8a4bf34a
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     added c
-  
-
-Testing the case when "merging results in same as public cset" where:
-both the csets are on different parent and no conflict in merging and relocation.
----------------------------------------------------------------------------------
-
-Prepare the repo:
-
-  $ cd ..
-  $ hg init pubdiv6
-  $ cd pubdiv6
-  $ for ch in a b c d; do
-  >   echo $ch > $ch;
-  >   hg ci -Am "added "$ch;
-  > done;
-  adding a
-  adding b
-  adding c
-  adding d
-
-  $ hg up 1
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo dh > dh
-  $ hg add dh
-  $ hg ci -m "added dh"
-  created new head
-
-  $ hg up 2
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo dh > dh
-  $ hg add dh
-  $ hg ci -m "added d"
-  created new head
-
-  $ hg glog
-  @  5:e800202333a4 added d
-  |   draft
-  |
-  | o  4:5acd58ef5066 added dh
-  | |   draft
-  | |
-  +---o  3:9150fe93bec6 added d
-  | |     draft
-  | |
-  o |  2:155349b645be added c
-  |/    draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-  $ hg prune 3 -s 4
-  1 changesets pruned
-  $ hg prune 3 -s 5 --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-  $ hg phase --public -r 5
-
-  $ hg glog
-  @  5:e800202333a4 added d
-  |   public
-  |
-  | *  4:5acd58ef5066 added dh
-  | |   draft content-divergent
-  | |
-  o |  2:155349b645be added c
-  |/    public
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-  $ hg evolve --content-divergent --any
-  merge:[5] added d
-  with: [4] added dh
-  base: [3] added d
-  rebasing "other" content-divergent changeset 5acd58ef5066 on 155349b645be
-  updating to "local" side of the conflict: e800202333a4
-  merging "other" content-divergent changeset 'ae3429430ef1'
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  content-divergent changesets differ by descriptions only, discarding ae3429430ef1
-
-  $ hg evolve -l
-
-  $ hg par
-  changeset:   5:e800202333a4
-  tag:         tip
-  parent:      2:155349b645be
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     added d
-  
-Testing the case when "merging results in same as public cset" where:
-both the csets are on same parent and merging leads to conflict.
----------------------------------------------------------------------
-
-Prepare the repo:
-
-  $ cd ..
-  $ hg init pubdiv7
-  $ cd pubdiv7
-  $ for ch in a b c; do
-  >   echo $ch > $ch;
-  >   hg ci -Am "added "$ch;
-  > done;
-  adding a
-  adding b
-  adding c
-
-  $ hg up .^
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo chconflict > ch
-  $ hg add ch
-  $ hg ci -m "added ch"
-  created new head
-
-  $ hg up .^
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo ch > ch
-  $ hg add ch
-  $ hg ci -m "added c"
-  created new head
-
-  $ hg glog
-  @  4:f7c1071f1e7c added c
-  |   draft
-  |
-  | o  3:229da2719b19 added ch
-  |/    draft
-  |
-  | o  2:155349b645be added c
-  |/    draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-  $ hg prune 2 -s 3
-  1 changesets pruned
-  $ hg prune 2 -s 4 --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-  $ hg phase --public -r 4
-
-  $ hg glog
-  @  4:f7c1071f1e7c added c
-  |   public
-  |
-  | *  3:229da2719b19 added ch
-  |/    draft content-divergent
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-  $ hg evolve --content-divergent --any
-  merge:[4] added c
-  with: [3] added ch
-  base: [2] added c
-  merging "other" content-divergent changeset '229da2719b19'
-  merging ch
-  warning: conflicts while merging ch! (edit, then use 'hg resolve --mark')
-  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ hg diff
-  diff -r f7c1071f1e7c ch
-  --- a/ch	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/ch	Thu Jan 01 00:00:00 1970 +0000
-  @@ -1,1 +1,5 @@
-  +<<<<<<< local: f7c1071f1e7c - test: added c
-   ch
-  +=======
-  +chconflict
-  +>>>>>>> other: 229da2719b19 - test: added ch
-
-  $ echo ch > ch
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  content-divergent changesets differ by descriptions only, discarding 229da2719b19
-  working directory is now at f7c1071f1e7c
-
-  $ hg evolve -l
-
-  $ hg par
-  changeset:   4:f7c1071f1e7c
-  tag:         tip
-  parent:      1:5f6d8a4bf34a
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     added c
-  
-Testing the case when "merging results in same as public cset" where:
-both the csets are on different parent and relocation leads to conflict but merging won't.
-------------------------------------------------------------------------------------------
-Prepare the repo:
-
-  $ cd ..
-  $ hg init pubdiv8
-  $ cd pubdiv8
-  $ for ch in a b c d; do
-  >   echo $ch > $ch;
-  >   hg ci -Am "added "$ch;
-  > done;
-  adding a
-  adding b
-  adding c
-  adding d
-
-  $ hg up 1
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo dh > dh
-  $ echo cc > c
-  $ hg add dh c
-  $ hg ci -m "added dh"
-  created new head
-
-  $ hg up 2
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo dh > dh
-  $ hg add dh
-  $ hg ci -m "added d"
-  created new head
-
-  $ hg glog
-  @  5:e800202333a4 added d
-  |   draft
-  |
-  | o  4:f89a8e2f86ac added dh
-  | |   draft
-  | |
-  +---o  3:9150fe93bec6 added d
-  | |     draft
-  | |
-  o |  2:155349b645be added c
-  |/    draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-  $ hg prune 3 -s 4
-  1 changesets pruned
-  $ hg prune 3 -s 5 --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-  $ hg phase --public -r 5
-
-  $ hg glog
-  @  5:e800202333a4 added d
-  |   public
-  |
-  | *  4:f89a8e2f86ac added dh
-  | |   draft content-divergent
-  | |
-  o |  2:155349b645be added c
-  |/    public
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-  $ hg evolve --content-divergent --any
-  merge:[5] added d
-  with: [4] added dh
-  base: [3] added d
-  rebasing "other" content-divergent changeset f89a8e2f86ac on 155349b645be
-  merging c
-  warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ echo c > c
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  evolving 4:f89a8e2f86ac "added dh"
-  updating to "local" side of the conflict: e800202333a4
-  merging "other" content-divergent changeset 'bc309da55b88'
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  content-divergent changesets differ by descriptions only, discarding bc309da55b88
-  working directory is now at e800202333a4
-
-  $ hg evolve -l
-
-  $ hg par
-  changeset:   5:e800202333a4
-  tag:         tip
-  parent:      2:155349b645be
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     added d
-  
-Testing the case when "merging results in same as public cset" where:
-both the csets are on different parent and merging leads to conflict but relocation won't.
-------------------------------------------------------------------------------------------
-Prepare the repo:
-
-  $ cd ..
-  $ hg init pubdiv9
-  $ cd pubdiv9
-  $ for ch in a b c d; do
-  >   echo $ch > $ch;
-  >   hg ci -Am "added "$ch;
-  > done;
-  adding a
-  adding b
-  adding c
-  adding d
-
-  $ hg up 1
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo dhconflict > dh
-  $ hg add dh
-  $ hg ci -m "added dh"
-  created new head
-
-  $ hg up 2
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo dh > dh
-  $ hg add dh
-  $ hg ci -m "added d"
-  created new head
-
-  $ hg glog
-  @  5:e800202333a4 added d
-  |   draft
-  |
-  | o  4:db0b7bba0aae added dh
-  | |   draft
-  | |
-  +---o  3:9150fe93bec6 added d
-  | |     draft
-  | |
-  o |  2:155349b645be added c
-  |/    draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-  $ hg prune 3 -s 4
-  1 changesets pruned
-  $ hg prune 3 -s 5 --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-  $ hg phase --public -r 5
-
-  $ hg glog
-  @  5:e800202333a4 added d
-  |   public
-  |
-  | *  4:db0b7bba0aae added dh
-  | |   draft content-divergent
-  | |
-  o |  2:155349b645be added c
-  |/    public
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-  $ hg evolve --content-divergent --any
-  merge:[5] added d
-  with: [4] added dh
-  base: [3] added d
-  rebasing "other" content-divergent changeset db0b7bba0aae on 155349b645be
-  updating to "local" side of the conflict: e800202333a4
-  merging "other" content-divergent changeset 'a5bbf2042450'
-  merging dh
-  warning: conflicts while merging dh! (edit, then use 'hg resolve --mark')
-  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ echo dh > dh
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  content-divergent changesets differ by descriptions only, discarding a5bbf2042450
-  working directory is now at e800202333a4
-
-  $ hg evolve -l
-
-  $ hg par
-  changeset:   5:e800202333a4
-  tag:         tip
-  parent:      2:155349b645be
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     added d
-  
-
-Testing the case when "merging results in same as public cset" where:
-both the csets are on different parent and relocation and merging both leads to conflict:
------------------------------------------------------------------------------------------
-Prepare the repo:
-
-  $ cd ..
-  $ hg init pubdiv10
-  $ cd pubdiv10
-  $ for ch in a b c d; do
-  >   echo $ch > $ch;
-  >   hg ci -Am "added "$ch;
-  > done;
-  adding a
-  adding b
-  adding c
-  adding d
-
-  $ hg up 1
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ echo dhconflict > dh
-  $ echo cc > c
-  $ hg add dh c
-  $ hg ci -m "added dh"
-  created new head
-
-  $ hg up 2
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo dh > dh
-  $ hg add dh
-  $ hg ci -m "added d"
-  created new head
-
-  $ hg glog
-  @  5:e800202333a4 added d
-  |   draft
-  |
-  | o  4:67b19bbd770f added dh
-  | |   draft
-  | |
-  +---o  3:9150fe93bec6 added d
-  | |     draft
-  | |
-  o |  2:155349b645be added c
-  |/    draft
-  |
-  o  1:5f6d8a4bf34a added b
-  |   draft
-  |
-  o  0:9092f1db7931 added a
-      draft
-  
-
-  $ hg prune 3 -s 4
-  1 changesets pruned
-  $ hg prune 3 -s 5 --hidden
-  1 changesets pruned
-  2 new content-divergent changesets
-  $ hg phase --public -r 5
-
-  $ hg glog
-  @  5:e800202333a4 added d
-  |   public
-  |
-  | *  4:67b19bbd770f added dh
-  | |   draft content-divergent
-  | |
-  o |  2:155349b645be added c
-  |/    public
-  |
-  o  1:5f6d8a4bf34a added b
-  |   public
-  |
-  o  0:9092f1db7931 added a
-      public
-  
-  $ hg evolve --content-divergent --any
-  merge:[5] added d
-  with: [4] added dh
-  base: [3] added d
-  rebasing "other" content-divergent changeset 67b19bbd770f on 155349b645be
-  merging c
-  warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ echo c > c
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  evolving 4:67b19bbd770f "added dh"
-  updating to "local" side of the conflict: e800202333a4
-  merging "other" content-divergent changeset '09054d1f3c97'
-  merging dh
-  warning: conflicts while merging dh! (edit, then use 'hg resolve --mark')
-  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-  fix conflicts and see `hg help evolve.interrupted`
-  [1]
-
-  $ echo dh > dh
-  $ hg res -m
-  (no more unresolved files)
-  continue: hg evolve --continue
-
-  $ hg evolve --continue
-  content-divergent changesets differ by descriptions only, discarding 09054d1f3c97
-  working directory is now at e800202333a4
-
-  $ hg evolve -l
-
-  $ hg par
-  changeset:   5:e800202333a4
-  tag:         tip
-  parent:      2:155349b645be
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     added d
-  
-
-  $ cd ..
-
-Test a pratical "rebase" case
-=============================
-
-Initial setup
-
-  $ hg init rebase-divergence
-  $ cd rebase-divergence
-  $ echo root >> root
-  $ hg add root
-  $ hg commit -m root
-  $ for x in c_A c_B c_C c_D; do
-  >     echo $x >> $x
-  >     hg add $x
-  >     hg commit -m $x
-  > done
-
-  $ hg up 'desc("c_A")'
-  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
-
-  $ for x in c_E c_F; do
-  >     echo $x >> $x
-  >     hg add $x
-  >     hg commit -m $x
-  > done
-  created new head
-
-(creating divergence locally for simplicity)
-
-  $ node=`hg log --rev 'desc("c_E")' -T '{node}'`
-  $ hg rebase -s $node -d 'desc("c_B")'
-  rebasing 5:4ab2719bbab9 "c_E"
-  rebasing 6:77ccbf8d837e "c_F" (tip)
-  $ hg phase --public tip
-  $ hg rebase --hidden -s $node -d 'desc("c_C")' --config experimental.evolution.allowdivergence=yes
-  rebasing 5:4ab2719bbab9 "c_E"
-  rebasing 6:77ccbf8d837e "c_F"
-  2 new content-divergent changesets
-
-  $ hg sum
-  parent: 8:a52ac76b45f5 
-   c_F
-  branch: default
-  commit: (clean)
-  update: 4 new changesets, 3 branch heads (merge)
-  phases: 4 draft
-  content-divergent: 2 changesets
-  $ hg evolve --list
-  b4a584aea4bd: c_E
-    content-divergent: c7d2d47c7240 (public) (precursor 4ab2719bbab9)
-  
-  8ae8db670b4a: c_F
-    content-divergent: a52ac76b45f5 (public) (precursor 77ccbf8d837e)
-  
-  $ hg log -G --patch
-  *  changeset:   10:8ae8db670b4a
-  |  tag:         tip
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  instability: content-divergent
-  |  summary:     c_F
-  |
-  |  diff -r b4a584aea4bd -r 8ae8db670b4a c_F
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c_F	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c_F
-  |
-  *  changeset:   9:b4a584aea4bd
-  |  parent:      3:abb77b893f28
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  instability: content-divergent
-  |  summary:     c_E
-  |
-  |  diff -r abb77b893f28 -r b4a584aea4bd c_E
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c_E	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c_E
-  |
-  | @  changeset:   8:a52ac76b45f5
-  | |  user:        test
-  | |  date:        Thu Jan 01 00:00:00 1970 +0000
-  | |  summary:     c_F
-  | |
-  | |  diff -r c7d2d47c7240 -r a52ac76b45f5 c_F
-  | |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  | |  +++ b/c_F	Thu Jan 01 00:00:00 1970 +0000
-  | |  @@ -0,0 +1,1 @@
-  | |  +c_F
-  | |
-  | o  changeset:   7:c7d2d47c7240
-  | |  parent:      2:eb1b4e1205b8
-  | |  user:        test
-  | |  date:        Thu Jan 01 00:00:00 1970 +0000
-  | |  summary:     c_E
-  | |
-  | |  diff -r eb1b4e1205b8 -r c7d2d47c7240 c_E
-  | |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  | |  +++ b/c_E	Thu Jan 01 00:00:00 1970 +0000
-  | |  @@ -0,0 +1,1 @@
-  | |  +c_E
-  | |
-  +---o  changeset:   4:dbb960d6c97c
-  | |    user:        test
-  | |    date:        Thu Jan 01 00:00:00 1970 +0000
-  | |    summary:     c_D
-  | |
-  | |    diff -r abb77b893f28 -r dbb960d6c97c c_D
-  | |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  | |    +++ b/c_D	Thu Jan 01 00:00:00 1970 +0000
-  | |    @@ -0,0 +1,1 @@
-  | |    +c_D
-  | |
-  o |  changeset:   3:abb77b893f28
-  |/   user:        test
-  |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    summary:     c_C
-  |
-  |    diff -r eb1b4e1205b8 -r abb77b893f28 c_C
-  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |    +++ b/c_C	Thu Jan 01 00:00:00 1970 +0000
-  |    @@ -0,0 +1,1 @@
-  |    +c_C
-  |
-  o  changeset:   2:eb1b4e1205b8
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     c_B
-  |
-  |  diff -r e31751786014 -r eb1b4e1205b8 c_B
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c_B	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c_B
-  |
-  o  changeset:   1:e31751786014
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     c_A
-  |
-  |  diff -r 1e4be0697311 -r e31751786014 c_A
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c_A	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c_A
-  |
-  o  changeset:   0:1e4be0697311
-     user:        test
-     date:        Thu Jan 01 00:00:00 1970 +0000
-     summary:     root
-  
-     diff -r 000000000000 -r 1e4be0697311 root
-     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-     +++ b/root	Thu Jan 01 00:00:00 1970 +0000
-     @@ -0,0 +1,1 @@
-     +root
-  
-
-Run automatic evolution
-
-  $ hg evolve --content-divergent --rev 'not public() and desc("c_E")::'
-  merge:[7] c_E
-  with: [9] c_E
-  base: [5] c_E
-  rebasing "other" content-divergent changeset b4a584aea4bd on eb1b4e1205b8
-  updating to "local" side of the conflict: c7d2d47c7240
-  merging "other" content-divergent changeset '0773642cfa95'
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  1 new orphan changesets
-  merge:[8] c_F
-  with: [10] c_F
-  base: [6] c_F
-  rebasing "other" content-divergent changeset 8ae8db670b4a on c7d2d47c7240
-  updating to "local" side of the conflict: a52ac76b45f5
-  merging "other" content-divergent changeset '6a87ed4aa317'
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg sum
-  parent: 8:a52ac76b45f5 tip
-   c_F
-  branch: default
-  commit: (clean)
-  update: 2 new changesets, 2 branch heads (merge)
-  phases: 2 draft
-
-  $ hg evolve --list
-
-  $ hg log -G --patch
-  @  changeset:   8:a52ac76b45f5
-  |  tag:         tip
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     c_F
-  |
-  |  diff -r c7d2d47c7240 -r a52ac76b45f5 c_F
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c_F	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c_F
-  |
-  o  changeset:   7:c7d2d47c7240
-  |  parent:      2:eb1b4e1205b8
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     c_E
-  |
-  |  diff -r eb1b4e1205b8 -r c7d2d47c7240 c_E
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c_E	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c_E
-  |
-  | o  changeset:   4:dbb960d6c97c
-  | |  user:        test
-  | |  date:        Thu Jan 01 00:00:00 1970 +0000
-  | |  summary:     c_D
-  | |
-  | |  diff -r abb77b893f28 -r dbb960d6c97c c_D
-  | |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  | |  +++ b/c_D	Thu Jan 01 00:00:00 1970 +0000
-  | |  @@ -0,0 +1,1 @@
-  | |  +c_D
-  | |
-  | o  changeset:   3:abb77b893f28
-  |/   user:        test
-  |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    summary:     c_C
-  |
-  |    diff -r eb1b4e1205b8 -r abb77b893f28 c_C
-  |    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |    +++ b/c_C	Thu Jan 01 00:00:00 1970 +0000
-  |    @@ -0,0 +1,1 @@
-  |    +c_C
-  |
-  o  changeset:   2:eb1b4e1205b8
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     c_B
-  |
-  |  diff -r e31751786014 -r eb1b4e1205b8 c_B
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c_B	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c_B
-  |
-  o  changeset:   1:e31751786014
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     c_A
-  |
-  |  diff -r 1e4be0697311 -r e31751786014 c_A
-  |  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  |  +++ b/c_A	Thu Jan 01 00:00:00 1970 +0000
-  |  @@ -0,0 +1,1 @@
-  |  +c_A
-  |
-  o  changeset:   0:1e4be0697311
-     user:        test
-     date:        Thu Jan 01 00:00:00 1970 +0000
-     summary:     root
-  
-     diff -r 000000000000 -r 1e4be0697311 root
-     --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-     +++ b/root	Thu Jan 01 00:00:00 1970 +0000
-     @@ -0,0 +1,1 @@
-     +root
-  
-  $ hg export tip
-  # HG changeset patch
-  # User test
-  # Date 0 0
-  #      Thu Jan 01 00:00:00 1970 +0000
-  # Node ID a52ac76b45f523a039fc4a938d79874f4bdb1a85
-  # Parent  c7d2d47c7240562be5cbd1a24080dd0396178709
-  c_F
-  
-  diff -r c7d2d47c7240 -r a52ac76b45f5 c_F
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/c_F	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +c_F
-
-  $ hg obslog --rev a52ac76b45f5
-  @    a52ac76b45f5 (8) c_F
-  |\
-  x |  6a87ed4aa317 (12) c_F
-  | |    rewritten as a52ac76b45f5 using evolve by test (Thu Jan 01 00:00:00 1970 +0000)
-  | |
-  x |  8ae8db670b4a (10) c_F
-  |/     rewritten(parent) as 6a87ed4aa317 using evolve by test (Thu Jan 01 00:00:00 1970 +0000)
-  |
-  x  77ccbf8d837e (6) c_F
-       rewritten(parent) as 8ae8db670b4a using rebase by test (Thu Jan 01 00:00:00 1970 +0000)
-       rewritten(parent) as a52ac76b45f5 using rebase by test (Thu Jan 01 00:00:00 1970 +0000)
-  
--- a/tests/test-evolve-serveronly-bundle2.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-serveronly-bundle2.t	Wed Jun 05 17:46:06 2019 +0200
@@ -86,9 +86,9 @@
 ===================
 
   $ curl -s http://localhost:$HGPORT/?cmd=hello
-  capabilities: _evoext_getbundle_obscommon _evoext_obshash_0 _evoext_obshash_1 _evoext_obshashrange_v1 batch * (glob)
+  capabilities: _evoext_getbundle_obscommon _evoext_obshashrange_v1 batch * (glob)
   $ curl -s http://localhost:$HGPORT/?cmd=capabilities
-  _evoext_getbundle_obscommon _evoext_obshash_0 _evoext_obshash_1 _evoext_obshashrange_v1 batch * (no-eol) (glob)
+  _evoext_getbundle_obscommon _evoext_obshashrange_v1 batch * (no-eol) (glob)
 
   $ curl -s "http://localhost:$HGPORT/?cmd=listkeys&namespace=namespaces" | sort
   bookmarks	
@@ -151,9 +151,9 @@
   obsolete	
   phases	
   $ curl -s http://localhost:$HGPORT/?cmd=hello
-  capabilities: _evoext_getbundle_obscommon _evoext_obshash_0 _evoext_obshash_1 _evoext_obshashrange_v1 batch * (glob)
+  capabilities: _evoext_getbundle_obscommon _evoext_obshashrange_v1 batch * (glob)
   $ curl -s http://localhost:$HGPORT/?cmd=capabilities
-  _evoext_getbundle_obscommon _evoext_obshash_0 _evoext_obshash_1 _evoext_obshashrange_v1 batch * (no-eol) (glob)
+  _evoext_getbundle_obscommon _evoext_obshashrange_v1 batch * (no-eol) (glob)
 
   $ echo '[experimental]' >> server/.hg/hgrc
   $ echo 'evolution=!' >> server/.hg/hgrc
@@ -178,9 +178,9 @@
   phases	
 
   $ curl -s http://localhost:$HGPORT/?cmd=hello
-  capabilities: _evoext_getbundle_obscommon _evoext_obshash_0 _evoext_obshash_1 _evoext_obshashrange_v1 batch * (glob)
+  capabilities: _evoext_getbundle_obscommon _evoext_obshashrange_v1 batch * (glob)
   $ curl -s http://localhost:$HGPORT/?cmd=capabilities
-  _evoext_getbundle_obscommon _evoext_obshash_0 _evoext_obshash_1 _evoext_obshashrange_v1 batch * (no-eol) (glob)
+  _evoext_getbundle_obscommon _evoext_obshashrange_v1 batch * (no-eol) (glob)
 
 Test obshashrange discover
 ===========================================
--- a/tests/test-evolve-split.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-split.t	Wed Jun 05 17:46:06 2019 +0200
@@ -59,4 +59,3 @@
   $ hg evolve --rev "0::"
   move:[2] add uu
   atop:[4] _pp
-  working directory is now at 6f5bbe2e3df3
--- a/tests/test-evolve-stop-orphan.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-stop-orphan.t	Wed Jun 05 17:46:06 2019 +0200
@@ -190,7 +190,7 @@
 we do `evolve --stop`
 --------------------------------------------------------------------------------
 
-  $ hg evolve
+  $ hg evolve --update
   move:[4] added d
   atop:[5] added c
   merging d
@@ -292,13 +292,13 @@
   evolving 5:cb6a2ab625bb "added c"
   move:[6] added d
   atop:[10] added c
-  working directory is now at cd0909a30222
+  working directory is now at aec285328e90
   $ hg glog
-  @  11:cd0909a30222 added d
+  o  11:cd0909a30222 added d
   |   () draft
   o  10:cb1dd1086ef6 added c
   |   () draft
-  o  9:aec285328e90 added b
+  @  9:aec285328e90 added b
   |   () draft
   o  8:fd00db71edca added a
   |   () draft
@@ -309,8 +309,8 @@
 bookmarks of rest of them should stay where they are are
 -------------------------------------------------------------------------
 
-  $ hg up .^
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg up tip^
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg bookmark b1
   $ hg up .^
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
--- a/tests/test-evolve-templates.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-templates.t	Wed Jun 05 17:46:06 2019 +0200
@@ -1544,7 +1544,7 @@
   $ mkcommit A0
   $ hg prune .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at ea207398892e
+  working directory is now at ea207398892e
   1 changesets pruned
 
 Check output
--- a/tests/test-evolve-topic.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve-topic.t	Wed Jun 05 17:46:06 2019 +0200
@@ -132,7 +132,7 @@
   s1: add ccc
   s0^ add bbb (base)
 
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[s3] add eee
   atop:[s2] add ddd
   move:[s4] add fff
@@ -168,7 +168,7 @@
 Test that evolve does not loose topic information
 -------------------------------------------------
 
-  $ hg evolve --rev 'topic(bar)'
+  $ hg evolve --rev 'topic(bar)' --update
   move:[6] add ggg
   atop:[13] add fff
   move:[7] add hhh
@@ -304,7 +304,7 @@
   
 
   $ hg topic
-   * bar (5 changesets, 4 troubled)
+   * bar (5 changesets, 4 unstable)
      foo (3 changesets)
 
 When the current topic, obsoleted changesets topic and successor topic are same
@@ -393,9 +393,6 @@
   move:[s3] add hhh
   move:[s4] add iii
   move:[s5] add jjj
-  working directory is now at 38a82cbb794a
-  $ hg up 18
-  0 files updated, 0 files merged, 4 files removed, 0 files unresolved
   $ echo "changes in hhh" > hhh
   $ hg add hhh
   $ hg ci --amend
@@ -440,4 +437,4 @@
   move:[s4] add iii
   atop:[s3] add hhh
   move:[s5] add jjj
-  working directory is now at 119e4c126fb2
+  working directory is now at 2c295936ac04
--- a/tests/test-evolve.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-evolve.t	Wed Jun 05 17:46:06 2019 +0200
@@ -156,7 +156,7 @@
   5
   $ hg prune .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at fbb94e3a0ecf
+  working directory is now at fbb94e3a0ecf
   1 changesets pruned
   $ hg qlog
   4 - fbb94e3a0ecf add e (draft)
@@ -169,7 +169,7 @@
 
   $ hg prune 4 -r 3
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at 7c3bad9141dc
+  working directory is now at 7c3bad9141dc
   2 changesets pruned
   $ hg qlog
   2 - 4538525df7e2 add c (draft)
@@ -184,7 +184,7 @@
   $ hg add g
   $ hg prune .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at 7c3bad9141dc
+  working directory is now at 7c3bad9141dc
   1 changesets pruned
   $ hg st
   A g
@@ -368,7 +368,6 @@
   move:[3] another feature (child of 568a468b60fc)
   atop:[4] a nifty feature
   merging main-file-1
-  working directory is now at 99833d22b0c6
   $ hg log
   5	feature-B: another feature (child of ba0ec09b1bab) - test
   4	feature-A: a nifty feature - test
@@ -377,7 +376,7 @@
 Test commit -o options
 
   $ hg up -r "desc('a nifty feature')"
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg revert -r "desc('another feature')" --all
   adding file-from-B
   reverting main-file-1
@@ -442,7 +441,7 @@
 
 (ninja test for the {trouble} template:
 
-  $ hg log -G --template '{rev} {troubles}\n'
+  $ hg log -G --template '{rev} {instabilities}\n'
   @  10
   |
   | *  9 orphan
@@ -467,13 +466,12 @@
   merging main-file-1
   move:[9] dansk 3!
   merging main-file-1
-  working directory is now at 96abb1319a47
   $ hg log -G
-  @  12	: dansk 3! - test
+  o  12	: dansk 3! - test
   |
   o  11	: dansk 2! - test
   |
-  o  10	feature-B: dansk! - test
+  @  10	feature-B: dansk! - test
   |
   o  5	: another feature (child of ba0ec09b1bab) - test
   |
@@ -838,6 +836,8 @@
 Test fold with commit messages
 
   $ cd ../work
+  $ hg up
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg fold --from .^ --message "Folding with custom commit message"
   2 changesets folded
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -907,12 +907,11 @@
   $ hg evolve
   move:[3] a3
   atop:[4] a2
-  working directory is now at 7c5649f73d11
 
   $ hg log -G --template '{rev} [{branch}] {desc|firstline}\n'
-  @  5 [mybranch] a3
+  o  5 [mybranch] a3
   |
-  o  4 [mybranch] a2
+  @  4 [mybranch] a2
   |
   o  1 [default] a1
   |
@@ -925,28 +924,24 @@
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg amend -m 'a1_'
   2 new orphan changesets
-  $ hg evolve
+  $ hg evolve --rev 'first(orphan())'
   move:[4] a2
   atop:[6] a1_
-  working directory is now at eb07e22a0e63
   $ hg evolve
   move:[5] a3
   atop:[7] a2
-  working directory is now at 777c26ca5e78
   $ hg log -G --template '{rev} [{branch}] {desc|firstline}\n'
-  @  8 [mybranch] a3
+  o  8 [mybranch] a3
   |
   o  7 [mybranch] a2
   |
-  o  6 [default] a1_
+  @  6 [default] a1_
   |
   o  0 [default] a0
   
 
 Evolve from the middle of a stack pick the right changesets.
 
-  $ hg up -r "desc('a1_')"
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg ci --amend -m 'a1__'
   2 new orphan changesets
 
@@ -977,17 +972,16 @@
   $ ls .hg/bookmarks*
   .hg/bookmarks
   .hg/bookmarks.* (glob)
-  $ hg evolve
+  $ hg evolve --rev 'first(orphan())'
   move:[7] a2
   atop:[9] a1__
   (leaving bookmark testbookmark)
-  working directory is now at d952e93add6f
   $ ls .hg/bookmarks*
   .hg/bookmarks
   $ glog
-  @  10:d952e93add6f@mybranch(draft) a2
+  o  10:d952e93add6f@mybranch(draft) a2
   |
-  o  9:9f8b83c2e7f3@default(draft) a1__
+  @  9:9f8b83c2e7f3@default(draft) a1__
   |
   | *  8:777c26ca5e78@mybranch(draft) a3
   | |
@@ -1000,8 +994,6 @@
 
 Possibility to select what instability to solve first, asking for
 phase-divergent before content-divergent
-  $ hg up -r "desc('a1__')"
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg revert -r d952e93add6f --all
   reverting a
   $ hg log -G --template '{rev} [{branch}] {desc|firstline}\n'
@@ -1064,11 +1056,10 @@
   $ hg evolve --any
   move:[8] a3
   atop:[12] phase-divergent update to d952e93add6f:
-  working directory is now at b88539ad24d7
   $ glog
-  @  13:b88539ad24d7@default(draft) a3
+  o  13:b88539ad24d7@default(draft) a3
   |
-  o  12:a8bb31d4b7f2@default(draft) phase-divergent update to d952e93add6f:
+  @  12:a8bb31d4b7f2@default(draft) phase-divergent update to d952e93add6f:
   |
   o  10:d952e93add6f@mybranch(public) a2
   |
@@ -1079,7 +1070,7 @@
 
 Check that we can resolve instabilities in a revset with more than one commit
   $ hg up b88539ad24d7 -C
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ mkcommit gg
   $ hg up b88539ad24d7
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -1137,13 +1128,12 @@
   atop:[16] a3
   move:[15] add gh
   atop:[16] a3
-  working directory is now at 0c049e4e5422
   $ glog
-  @  18:0c049e4e5422@default(draft) add gh
+  o  18:0c049e4e5422@default(draft) add gh
   |
   | o  17:98e171e2f272@default(draft) add gg
   |/
-  o  16:0cf3707e8971@default(draft) a3
+  @  16:0cf3707e8971@default(draft) a3
   |
   o  12:a8bb31d4b7f2@default(draft) phase-divergent update to d952e93add6f:
   |
@@ -1252,7 +1242,7 @@
   $ hg --hidden up 14
   updating to a hidden changeset 484fb3cfa7f2
   (hidden revision '484fb3cfa7f2' was rewritten as: 98e171e2f272)
-  2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory parent is obsolete! (484fb3cfa7f2)
   $ cat >> $HGRCPATH <<EOF
   > [experimental]
@@ -1354,15 +1344,14 @@
   move:[20] add j2
   atop:[23] add j1
   move:[21] add j3
-  working directory is now at 0d9203b74542
   $ glog -r "0cf3707e8971::"
-  @  25:0d9203b74542@default(draft) add j3
+  o  25:0d9203b74542@default(draft) add j3
   |
   o  24:f1b85956c48c@default(draft) add j2
   |
   o  23:0ef9ff75f8e2@default(draft) add j1
   |
-  | o  18:0c049e4e5422@default(draft) add gh
+  | @  18:0c049e4e5422@default(draft) add gh
   | |
   o |  17:98e171e2f272@default(draft) add gg
   |/
@@ -1370,7 +1359,7 @@
   |
   ~
   $ hg up 98e171e2f272
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ mkcommit c5_
   created new head
   $ hg prune '0ef9ff75f8e2 + f1b85956c48c'
@@ -1418,74 +1407,18 @@
   $ hg fold --exact "98e171e2f272::"
   2 changesets folded
 
-Check that evolve shows error while handling split commits
---------------------------------------
+Check that dirstate changes are kept at failure for conflicts (issue4966)
+----------------------------------------
 
   $ cat >> $HGRCPATH <<EOF
   > [experimental]
   > evolution=all
   > EOF
 
-  $ glog -r "0cf3707e8971::"
-  o  28:92ca6f3984de@default(draft) add gg
-  |
-  | @  27:2d1b55e10be9@default(draft) add unstableifparentisfolded
-  |/
-  | o  18:0c049e4e5422@default(draft) add gh
-  |/
-  o  16:0cf3707e8971@default(draft) a3
-  |
-  ~
-
-Create a split commit
-  $ printf "oo" > oo;
-  $ printf "pp" > pp;
-  $ hg add oo pp
-  $ hg commit -m "oo+pp"
-  $ mkcommit uu
-  $ hg up 2d1b55e10be9
-  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
-  $ printf "oo" > oo;
-  $ hg add oo
-  $ hg commit -m "_oo"
-  created new head
-  $ printf "pp" > pp;
-  $ hg add pp
-  $ hg commit -m "_pp"
-  $ hg prune --succ "desc(_oo) + desc(_pp)" -r "desc('oo+pp')" --split
-  1 changesets pruned
-  1 new orphan changesets
-  $ glog -r "0cf3707e8971::"
-  @  32:c7dbf668e9d5@default(draft) _pp
-  |
-  o  31:2b5a32114b3d@default(draft) _oo
-  |
-  | *  30:4d122571f3b6@default(draft) add uu
-  | |
-  | x  29:7da3e73df8a5@default(draft) oo+pp
-  |/
-  | o  28:92ca6f3984de@default(draft) add gg
-  | |
-  o |  27:2d1b55e10be9@default(draft) add unstableifparentisfolded
-  |/
-  | o  18:0c049e4e5422@default(draft) add gh
-  |/
-  o  16:0cf3707e8971@default(draft) a3
-  |
-  ~
-  $ hg evolve --rev "0cf3707e8971::"
-  move:[30] add uu
-  atop:[32] _pp
-  working directory is now at be23044af550
-
-
-Check that dirstate changes are kept at failure for conflicts (issue4966)
-----------------------------------------
-
   $ echo "will be amended" > newfile
   $ hg commit -m "will be amended"
   $ hg parents
-  34	: will be amended - test
+  29	: will be amended - test
 
   $ echo "will be evolved safely" >> a
   $ hg commit -m "will be evolved safely"
@@ -1496,17 +1429,11 @@
   $ hg commit -m "will cause conflict at evolve"
 
   $ glog -r "0cf3707e8971::"
-  @  36:59c37c5bebd1@default(draft) will cause conflict at evolve
-  |
-  o  35:7cc12c6c7862@default(draft) will be evolved safely
-  |
-  o  34:98c7ab460e6b@default(draft) will be amended
+  @  31:5be050657ca5@default(draft) will cause conflict at evolve
   |
-  o  33:be23044af550@default(draft) add uu
+  o  30:748126f98ff1@default(draft) will be evolved safely
   |
-  o  32:c7dbf668e9d5@default(draft) _pp
-  |
-  o  31:2b5a32114b3d@default(draft) _oo
+  o  29:4548f3a8db2c@default(draft) will be amended
   |
   | o  28:92ca6f3984de@default(draft) add gg
   | |
@@ -1518,32 +1445,32 @@
   |
   ~
 
-  $ hg update -q 98c7ab460e6b
+  $ hg update -q -r "desc('will be amended')"
   $ echo "amended" > newfile
   $ hg amend -m "amended"
   2 new orphan changesets
 
-  $ hg evolve --rev "98c7ab460e6b::"
-  move:[35] will be evolved safely
-  atop:[37] amended
-  move:[36] will cause conflict at evolve
+  $ hg evolve --rev "desc('will be amended')::"
+  move:[30] will be evolved safely
+  atop:[32] amended
+  move:[31] will cause conflict at evolve
   merging newfile
   warning: conflicts while merging newfile! (edit, then use 'hg resolve --mark')
   fix conflicts and see `hg help evolve.interrupted`
   [1]
 
-  $ glog -r "be23044af550::" --hidden
-  @  38:61abd81de026@default(draft) will be evolved safely
+  $ glog -r "desc('add unstableifparentisfolded')::" --hidden
+  @  33:b9acdb1af6d5@default(draft) will be evolved safely
   |
-  o  37:df89d30f23e2@default(draft) amended
+  o  32:6ec468e4cb98@default(draft) amended
   |
-  | @  36:59c37c5bebd1@default(draft) will cause conflict at evolve
+  | @  31:5be050657ca5@default(draft) will cause conflict at evolve
   | |
-  | x  35:7cc12c6c7862@default(draft) will be evolved safely
+  | x  30:748126f98ff1@default(draft) will be evolved safely
   | |
-  | x  34:98c7ab460e6b@default(draft) will be amended
+  | x  29:4548f3a8db2c@default(draft) will be amended
   |/
-  o  33:be23044af550@default(draft) add uu
+  o  27:2d1b55e10be9@default(draft) add unstableifparentisfolded
   |
   ~
 
@@ -1581,6 +1508,7 @@
   update:[1] added a
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at ab832e43dd5a
+  no troubled changesets
 
   $ hg log -GT "{rev}:{node|short} {desc} ({bookmarks})\n" --hidden
   @  1:ab832e43dd5a added a (book)
@@ -1588,109 +1516,3 @@
   x  0:f7ad41964313 added a ()
   
   $ cd ..
-
-Test which shows that orphanmerge evolution can result to crash because of
-lastsolved not being updated in case of orphanmerge:
-(It will be fixed in next patch)
-
-Prepare the repo:
-  $ hg init orphanmergerepo
-  $ cd orphanmergerepo
-  $ echo a > a
-  $ for fn in a b c; do echo foo > $fn; hg ci -Am "added "$fn; done;
-  adding a
-  adding b
-  adding c
-Let's create a merge commit so that we can create orphan merge later:
-  $ hg up 1 -q
-  $ echo feature > f
-  $ hg ci -Am "added feature f"
-  adding f
-  created new head
-  $ hg merge
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  (branch merge, don't forget to commit)
-  $ hg ci -m "merge feature branch"
-  $ glog
-  @    4:2c0a98d38026@default(draft) merge feature branch
-  |\
-  | o  3:4c33e511041e@default(draft) added feature f
-  | |
-  o |  2:8be98ac1a569@default(draft) added c
-  |/
-  o  1:80e6d2c47cfe@default(draft) added b
-  |
-  o  0:f7ad41964313@default(draft) added a
-  
-
-Now make the parents of merge commit obsolete to get a orphan merge:
-  $ hg up 2 -q
-  $ echo "fixit" > c
-  $ hg ci --amend -m "updated c"
-  1 new orphan changesets
-  $ hg up 3 -q
-  $ echo "fixit" > c
-  $ hg ci --amend -m "updated f"
-  $ glog
-  @  6:086d9bedcd75@default(draft) updated f
-  |
-  | o  5:f84f2c548fbc@default(draft) updated c
-  |/
-  | *    4:2c0a98d38026@default(draft) merge feature branch
-  | |\
-  +---x  3:4c33e511041e@default(draft) added feature f
-  | |
-  | x  2:8be98ac1a569@default(draft) added c
-  |/
-  o  1:80e6d2c47cfe@default(draft) added b
-  |
-  o  0:f7ad41964313@default(draft) added a
-  
-
-To check `lastsolved` contain right value after completion of orphan-merge
-resolution there should be one more instability to be evolved; lets create one:
-  $ hg up 1 -q
-  $ echo d > d
-  $ hg ci -Am "added d"
-  adding c
-  adding d
-  created new head
-  $ echo e > e
-  $ hg ci -Am "added e"
-  adding e
-  $ hg up .^
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo "updated d" >> d
-  $ hg ci --amend -m "updated d"
-  1 new orphan changesets
-  $ glog
-  @  9:7c4d1834c346@default(draft) updated d
-  |
-  | *  8:421f7614462a@default(draft) added e
-  | |
-  | x  7:afe5acea1990@default(draft) added d
-  |/
-  | o  6:086d9bedcd75@default(draft) updated f
-  |/
-  | o  5:f84f2c548fbc@default(draft) updated c
-  |/
-  | *    4:2c0a98d38026@default(draft) merge feature branch
-  | |\
-  +---x  3:4c33e511041e@default(draft) added feature f
-  | |
-  | x  2:8be98ac1a569@default(draft) added c
-  |/
-  o  1:80e6d2c47cfe@default(draft) added b
-  |
-  o  0:f7ad41964313@default(draft) added a
-  
-Now we have one orphan merge and one more orphan cset that we just created.
-Lets evolve:
-  $ hg evolve --all --any
-  move:[4] merge feature branch
-  atop:[5] updated c
-  move:[10] merge feature branch
-  atop:[6] updated f
-  move:[8] added e
-  atop:[9] updated d
-  working directory is now at 7c67cee06242
--- a/tests/test-exchange-obsmarkers-case-D2.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-exchange-obsmarkers-case-D2.t	Wed Jun 05 17:46:06 2019 +0200
@@ -57,7 +57,7 @@
   obsoleted 1 changesets
   $ hg prune --date '0 0' .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at a9bdc8b26820
+  working directory is now at a9bdc8b26820
   1 changesets pruned
   $ hg strip --hidden -q 'desc(A1)' --config devel.strip-obsmarkers=no
   $ hg log -G --hidden
--- a/tests/test-exchange-obsmarkers-case-D3.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-exchange-obsmarkers-case-D3.t	Wed Jun 05 17:46:06 2019 +0200
@@ -60,7 +60,7 @@
   obsoleted 1 changesets
   $ hg prune -d '0 0' .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at 35b183996678
+  working directory is now at 35b183996678
   1 changesets pruned
   $ hg strip --hidden -q 'desc(A1)' --config devel.strip-obsmarkers=no
   $ hg log -G --hidden
--- a/tests/test-extension-isolation.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-extension-isolation.t	Wed Jun 05 17:46:06 2019 +0200
@@ -121,8 +121,6 @@
   [1]
   $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-evo | egrep 'topics|evoext'
     _evoext_getbundle_obscommon
-    _evoext_obshash_0
-    _evoext_obshash_1
     _evoext_obshashrange_v1
   $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-no-ext | egrep 'topics|evoext'
   [1]
@@ -144,21 +142,15 @@
   [1]
   $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-both | egrep 'topics|evoext'
     _evoext_getbundle_obscommon
-    _evoext_obshash_0
-    _evoext_obshash_1
     _evoext_obshashrange_v1
     topics
   $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-evo | egrep 'topics|evoext'
     _evoext_getbundle_obscommon
-    _evoext_obshash_0
-    _evoext_obshash_1
     _evoext_obshashrange_v1
   $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-topic | egrep 'topics|evoext'
     topics
   $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-evo | egrep 'topics|evoext'
     _evoext_getbundle_obscommon
-    _evoext_obshash_0
-    _evoext_obshash_1
     _evoext_obshashrange_v1
   $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-no-ext | egrep 'topics|evoext'
   [1]
--- a/tests/test-issue-5720.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-issue-5720.t	Wed Jun 05 17:46:06 2019 +0200
@@ -73,15 +73,15 @@
 Continue the evolution
   $ hg evolve --continue
   evolving 2:13833940840c "c"
-  working directory is now at 3d2080c198e5
+  working directory is now at 87495ea7c9ec
 
 Tip should stay in secret phase
   $ hg log -G -T "{rev}: {phase}"
-  @  4: secret
+  o  4: secret
   |
-  o  3: draft
+  @  3: draft
   |
   o  0: draft
   
-  $ hg log -r . -T '{phase}\n'
+  $ hg log -r tip -T '{phase}\n'
   secret
--- a/tests/test-issue-6028.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-issue-6028.t	Wed Jun 05 17:46:06 2019 +0200
@@ -112,7 +112,7 @@
   2 files updated, 0 files merged, 1 files removed, 0 files unresolved
 
 start the evolve
-  $ hg evolve
+  $ hg evolve --update --no-all
   move:[8] merged aa
   atop:[4] merged b
   working directory is now at c920dd828523
--- a/tests/test-obsolete.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-obsolete.t	Wed Jun 05 17:46:06 2019 +0200
@@ -66,9 +66,9 @@
   2
   - 4538525df7e2
 
-Test that obsolete precursors are properly computed
+Test that obsolete predecessors are properly computed
 
-  $ qlog -r 'precursors(.)' --hidden
+  $ qlog -r 'predecessors(.)' --hidden
   2
   - 4538525df7e2
   $ qlog -r .
@@ -110,7 +110,7 @@
   - 4538525df7e2
   3
   - 0d3f46688ccc
-  $ qlog -r 'allprecursors(4)' --hidden
+  $ qlog -r 'allpredecessors(4)' --hidden
   2
   - 4538525df7e2
   3
--- a/tests/test-prev-next.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-prev-next.t	Wed Jun 05 17:46:06 2019 +0200
@@ -198,7 +198,7 @@
   $ hg next --evolve --color debug
   [evolve.operation|move:][[evolve.rev|2]] added c
   atop:[[evolve.rev|3]] added b (2)
-  [ ui.status|working directory now at [evolve.node|e3b6d5df389b]]
+  [ ui.status|working directory is now at [evolve.node|e3b6d5df389b]]
 
 next with ambiguity
 
@@ -245,7 +245,7 @@
   enter the index of the revision you want to select: 1
   move:[4] added c
   atop:[6] added b (3)
-  working directory now at 5ce67c2407b0
+  working directory is now at 5ce67c2407b0
 
   $ hg log -GT "{rev}:{node|short} {desc}\n"
   @  7:5ce67c2407b0 added c
@@ -259,7 +259,7 @@
   o  0:a154386e50d1 added a
   
 
-  $ hg evolve -r 5
+  $ hg evolve -r 5 --update
   move:[5] added d
   atop:[6] added b (3)
   working directory is now at 47ea25be8aea
@@ -352,7 +352,7 @@
   got lock after (\d+) seconds (re)
   move:[2] two
   atop:[3] one
-  working directory now at a7d885c75614
+  working directory is now at a7d885c75614
   $ wait
 
 testing next --evolve when working directory is dirty
@@ -597,4 +597,4 @@
   > EOF
   move:[4] B
   atop:[5] B modified
-  working directory now at 1b434459c7e7
+  working directory is now at 1b434459c7e7
--- a/tests/test-prune.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-prune.t	Wed Jun 05 17:46:06 2019 +0200
@@ -58,7 +58,7 @@
 
   $ hg prune --user blah --date '1979-12-15' .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at 47d2a3944de8
+  working directory is now at 47d2a3944de8
   1 changesets pruned
   $ hg bookmark
    * BABAR                     3:47d2a3944de8
@@ -81,7 +81,7 @@
 
   $ hg prune 2: --color debug
   [ ui.status|0 files updated, 0 files merged, 3 files removed, 0 files unresolved]
-  [ ui.status|working directory now at [evolve.node|1f0dee641bb7]]
+  [ ui.status|working directory is now at [evolve.node|1f0dee641bb7]]
   [ ui.status|2 changesets pruned]
   $ hg debugobsolete
   9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'blah'}
@@ -142,7 +142,7 @@
   4 files updated, 0 files merged, 4 files removed, 0 files unresolved
   $ hg prune 'desc("add ee")' -s 'desc("add nE")'
   4 files updated, 0 files merged, 4 files removed, 0 files unresolved
-  working directory now at 6e8148413dd5
+  working directory is now at 6e8148413dd5
   1 changesets pruned
   $ hg debugobsolete
   9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'blah'}
@@ -239,7 +239,7 @@
 
   $ hg prune 'desc("add n1")::desc("add n2")' -s 'desc("add nD")::desc("add nE")' --pair
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  working directory now at 1f0dee641bb7
+  working directory is now at 1f0dee641bb7
   2 changesets pruned
   $ hg debugobsolete
   9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'blah'}
@@ -262,7 +262,7 @@
   $ mkcommit n2
   $ hg --config extensions.strip= --config experimental.prunestrip=True strip -r .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at c7e58696a948
+  working directory is now at c7e58696a948
   1 changesets pruned
   $ hg --config extensions.strip= --config experimental.prunestrip=True strip -r . --bundle
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -308,7 +308,7 @@
   $ hg prune -B todelete
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   (leaving bookmark todelete)
-  working directory now at d62d843c9a01
+  working directory is now at d62d843c9a01
   bookmark 'todelete' deleted
   1 changesets pruned
   $ hg id -ir dcbb326fdec2
--- a/tests/test-rewind.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-rewind.t	Wed Jun 05 17:46:06 2019 +0200
@@ -661,7 +661,7 @@
   $ echo AA >> A
   $ hg amend -m 'c_A1'
   1 new orphan changesets
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[2] c_B0
   atop:[3] c_A1
   working directory is now at a65fceb2324a
@@ -802,7 +802,7 @@
 Automatically rewinding the full stack (with --to)
 --------------------------------------------------
 
-  $ hg rewind --hidden --to 'precursors(.)'
+  $ hg rewind --hidden --to 'predecessors(.)'
   rewinded to 2 changesets
   (2 changesets obsoleted)
   working directory is now at 70892f498f29
--- a/tests/test-sharing.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-sharing.t	Wed Jun 05 17:46:06 2019 +0200
@@ -516,7 +516,6 @@
   merge:[5] fix bug 24 (v2 by bob)
   with: [6] fix bug 24 (v2 by alice)
   base: [4] fix bug 24 (v1)
-  merging "other" content-divergent changeset 'e3f99ce9d9cd'
   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
   working directory is now at b1499b0f03ca
   $ hg log -q -r 'contentdivergent()'
@@ -534,7 +533,7 @@
   o  3:a06ec1bf97bd  public  fix bug 15 (v2)
   |
   ~
-  $ hg --hidden shortlog -r 'precursors(b1499b0f03ca)'
+  $ hg --hidden shortlog -r 'predecessors(b1499b0f03ca)'
   5:a360947f6faf  draft  fix bug 24 (v2 by bob)
   6:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
   $ cat file1
--- a/tests/test-split.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-split.t	Wed Jun 05 17:46:06 2019 +0200
@@ -151,7 +151,7 @@
   $ echo "change to b" >> _b
   $ hg amend -m "_cprim"
   2 new orphan changesets
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[5] split1
   atop:[7] _cprim
   move:[6] split2
@@ -218,7 +218,7 @@
   2d8abdb827cdf71ca477ef6985d7ceb257c53c1b e2b4afde39803bd42bb1374b230fca1b1e8cc868 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '4', 'operation': 'evolve', 'user': 'test'}
   033b3f5ae73db67c10de938fb6f26b949aaef172 bb5e4f6020c74e7961a51fda635ea9df9b04dda8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '4', 'operation': 'evolve', 'user': 'test'}
   b434287e665ce757ee5463a965cb3d119ca9e893 ead2066d1dbf14833fe1069df1b735e4e9468c40 1188c4216eba37f18a1de6558564601d00ff2143 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'split', 'user': 'test'}
-  $ hg evolve --all
+  $ hg evolve --all --update
   move:[8] split1
   atop:[11] split4
   move:[9] split2
@@ -1108,16 +1108,14 @@
 Pruning revision 4 (current one):
   $ hg prune .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at 88437e073cd4
+  working directory is now at 88437e073cd4
   1 changesets pruned
   $ hg rebase -r 2 -d 3 --config extensions.rebase=
   rebasing 2:ab6ca3ebca74 "c"
-  $ hg up
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg glog
-  @  5:21a63bd6ee88 c (draft)
+  o  5:21a63bd6ee88 c (draft)
   |
-  o  3:88437e073cd4 split1 (draft)
+  @  3:88437e073cd4 split1 (draft)
   |
   o  0:a5a1faba8d26 p (draft)
   
--- a/tests/test-stabilize-conflict.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-stabilize-conflict.t	Wed Jun 05 17:46:06 2019 +0200
@@ -77,7 +77,7 @@
    dix
   $ hg amend
   1 new orphan changesets
-  $ hg evolve
+  $ hg evolve --update
   move:[2] babar count up to fifteen
   atop:[3] babar count up to ten
   merging babar
@@ -123,7 +123,7 @@
   +ten
   $ hg amend
   1 new orphan changesets
-  $ hg evolve
+  $ hg evolve --update
   move:[4] babar count up to fifteen
   atop:[5] babar count up to ten
   merging babar
--- a/tests/test-stabilize-order.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-stabilize-order.t	Wed Jun 05 17:46:06 2019 +0200
@@ -62,7 +62,7 @@
 
 Test stabilizing a predecessor child
 
-  $ hg evolve -v
+  $ hg evolve -v --rev 'last(orphan())'
   move:[4] addb
   atop:[5] adda
   hg rebase -r 22619daeed78 -d 005fe5914f78
@@ -72,11 +72,12 @@
   b
   committing manifest
   committing changelog
-  working directory is now at 81b8bbcd5892
+  resolving manifests
+  removing b
   $ glog
-  @  6:81b8bbcd5892@default(draft) addb
+  o  6:81b8bbcd5892@default(draft) addb
   |
-  o  5:005fe5914f78@default(draft) adda
+  @  5:005fe5914f78@default(draft) adda
   |
   | *  3:7a7552255fb5@default(draft) addc
   | |
@@ -89,10 +90,8 @@
 
 Test stabilizing a descendant predecessor's child
 
-  $ hg up -r 005fe5914f78
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg debugobsolete > successors.old
-  $ hg evolve -v
+  $ hg evolve -v --update
   move:[3] addc
   atop:[6] addb
   hg rebase -r 7a7552255fb5 -d 81b8bbcd5892
@@ -239,7 +238,7 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     addroot
   
-  $ hg evolve
+  $ hg evolve --no-all
   abort: multiple evolve candidates
   (select one of *, * with --rev) (glob)
   [255]
--- a/tests/test-stack-branch.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-stack-branch.t	Wed Jun 05 17:46:06 2019 +0200
@@ -87,14 +87,14 @@
 Test "t#" reference
 -------------------
 
-  $ hg up b2
+  $ hg up s2
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   $ hg up foo
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg up b42
-  abort: cannot resolve "b42": branch "foo" has only 4 non-public changesets
+  $ hg up s42
+  abort: cannot resolve "s42": branch "foo" has only 4 non-public changesets
   [255]
-  $ hg up b2
+  $ hg up s2
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   $ hg summary
   parent: 3:f61adbacd17a 
@@ -132,7 +132,7 @@
   s2@ c_d (current)
   s1: c_c
   s0^ c_b (base)
-  $ hg up b3
+  $ hg up s3
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg stack
   ### target: foo (branch)
@@ -141,7 +141,7 @@
   s2: c_d
   s1: c_c
   s0^ c_b (base)
-  $ hg up b2
+  $ hg up s2
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
 
 Also test the revset:
@@ -294,7 +294,7 @@
   s2@ c_D (current)
   s1: c_c
   s0^ c_b (base)
-  $ hg phase --public b1
+  $ hg phase --public s1
   $ hg stack
   ### target: foo (branch) (2 heads)
   s5: c_h
@@ -308,7 +308,7 @@
 Check that stack doesn't show changeset with a topic
 ----------------------------------------------------
 
-  $ hg topic --rev b4::b5 sometopic
+  $ hg topic --rev s4::s5 sometopic
   changed topic on 2 changesets to "sometopic"
   $ hg stack
   ### target: foo (branch)
--- a/tests/test-topic-flow-publish-bare.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-topic-flow-publish-bare.t	Wed Jun 05 17:46:06 2019 +0200
@@ -294,3 +294,30 @@
   |/
   o  0:ea207398892e ROOT public default
   
+
+Checking the option to prevent publishing
+=========================================
+
+Alone the option is a bit too restrictive to be useful. However combined with
+other tooling or extensions is can become an important permission tool.
+
+  $ hg log -r 'draft()'
+  changeset:   8:858be9a8daaf
+  topic:       bar
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     c_dH0
+  
+  changeset:   10:abb5c84eb9e9
+  topic:       bar
+  parent:      8:858be9a8daaf
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     c_dJ0
+  
+  $ hg phase --public -r 8 --config experimental.topic.allow-publish=no
+  abort: rejecting publishing of changeset 858be9a8daaf
+  [255]
+  $ hg phase --public -r 10 --config experimental.topic.allow-publish=no
+  abort: rejecting publishing of changeset 858be9a8daaf and 1 others
+  [255]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-topic-multiple.t	Wed Jun 05 17:46:06 2019 +0200
@@ -0,0 +1,69 @@
+Testing topics on cases when we have multiple topics based on top
+of other.
+  $ . "$TESTDIR/testlib/topic_setup.sh"
+
+Setup
+
+  $ cat << EOF >> $HGRCPATH
+  > [experimental]
+  > evolution = all
+  > [ui]
+  > interactive = True
+  > logtemplate = {rev} - \{{get(namespaces, "topics")}} {node|short} {desc} ({phase})\n
+  > [extensions]
+  > show =
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
+
+Test to make sure `hg evolve` don't solve troubles out of current stack:
+------------------------------------------------------------------------
+
+  $ hg init repo1
+  $ cd repo1
+  $ for ch in a b c; do
+  > echo $ch > $ch
+  > hg ci -Am "added "$ch --topic foo
+  > done;
+  adding a
+  active topic 'foo' grew its first changeset
+  (see 'hg help topics' for more information)
+  adding b
+  adding c
+
+  $ echo d > d
+  $ hg ci -Am "added d" --topic bar
+  adding d
+  active topic 'bar' grew its first changeset
+  (see 'hg help topics' for more information)
+
+  $ hg up -r "desc('added c')"
+  > echo cc >> c
+  switching to topic foo
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg amend
+  1 new orphan changesets
+
+  $ hg log -G
+  @  4 - {foo} 0cc68cbf943a added c (draft)
+  |
+  | *  3 - {bar} 94b12ff0f44a added d (draft)
+  | |
+  | x  2 - {foo} 9c315cf1e7de added c (draft)
+  |/
+  o  1 - {foo} ead01932caf0 added b (draft)
+  |
+  o  0 - {foo} 853c9ec0849e added a (draft)
+  
+
+  $ hg stack
+  ### topic: foo
+  ### target: default (branch)
+  s3@ added c (current)
+  s2: added b
+  s1: added a
+
+As expected, evolve should deny to evolve here as there is no troubled csets in current stack:
+  $ hg evolve --all
+  nothing to evolve on current working copy parent
+  (1 other orphan in the repository, do you want --any or --rev)
+  [2]
--- a/tests/test-topic-stack-complex.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-topic-stack-complex.t	Wed Jun 05 17:46:06 2019 +0200
@@ -142,9 +142,8 @@
   move:[s3] split2
   atop:[s2] split1
   move:[s4] Added e and f
-  working directory is now at ec94a1ed1330
   $ hg up s4
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg id -r .
   ec94a1ed1330 tip
   $ hg up --hidden 'min(precursors(.))'
@@ -173,7 +172,5 @@
   merge:[s5] Added e and f
   with: [s4] Added e and f
   base: [3] Added e and f
-  updating to "local" side of the conflict: ec94a1ed1330
-  merging "other" content-divergent changeset 'f2eff98490d2'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at 8faad6276dc6
--- a/tests/test-topic-stack-data.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-topic-stack-data.t	Wed Jun 05 17:46:06 2019 +0200
@@ -172,10 +172,10 @@
 basic output
 
   $ hg topic
-     bar (5 changesets, 1 troubled, 2 heads)
+     bar (5 changesets, 1 unstable, 2 heads)
      baz (2 changesets)
    * foo (2 changesets)
-     fuz (3 changesets, 2 troubled)
+     fuz (3 changesets, 2 unstable)
 
 quiet version
 
@@ -188,10 +188,10 @@
 verbose
 
   $ hg topic --verbose
-     bar (on branch: default, 5 changesets, 1 troubled, 2 heads)
+     bar (on branch: default, 5 changesets, 1 unstable, 2 heads)
      baz (on branch: default, 2 changesets, 2 behind)
    * foo (on branch: lake, 2 changesets, ambiguous destination: branch 'lake' has 2 heads)
-     fuz (on branch: default, 3 changesets, 2 troubled, 1 behind)
+     fuz (on branch: default, 3 changesets, 2 unstable, 1 behind)
 
 json
 
@@ -202,7 +202,7 @@
     "changesetcount": 5,
     "headcount": 2,
     "topic": "bar",
-    "troubledcount": 1
+    "unstablecount": 1
    },
    {
     "active": false,
@@ -218,7 +218,7 @@
     "active": false,
     "changesetcount": 3,
     "topic": "fuz",
-    "troubledcount": 2
+    "unstablecount": 2
    }
   ]
 
@@ -232,7 +232,7 @@
     "changesetcount": 5,
     "headcount": 2,
     "topic": "bar",
-    "troubledcount": 1
+    "unstablecount": 1
    },
    {
     "active": false,
@@ -254,7 +254,7 @@
     "branches+": "default",
     "changesetcount": 3,
     "topic": "fuz",
-    "troubledcount": 2
+    "unstablecount": 2
    }
   ]
 
--- a/tests/test-topic-stack.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-topic-stack.t	Wed Jun 05 17:46:06 2019 +0200
@@ -106,105 +106,117 @@
   $ hg stack -Tjson | python -m json.tool
   [
       {
+          "desc": "c_f",
           "isentry": true,
-          "topic.stack.desc": "c_f",
-          "topic.stack.index": 4,
-          "topic.stack.state": [
+          "node": "6559e6d93aeadba940874f54f106c61931b5b8cf",
+          "stack_index": 4,
+          "state": [
               "current"
           ],
-          "topic.stack.state.symbol": "@"
+          "symbol": "@"
       },
       {
+          "desc": "c_e",
           "isentry": true,
-          "topic.stack.desc": "c_e",
-          "topic.stack.index": 3,
-          "topic.stack.state": [
+          "node": "0f9ac936c87d1d991011862aff4e86d0c3300a89",
+          "stack_index": 3,
+          "state": [
               "clean"
           ],
-          "topic.stack.state.symbol": ":"
+          "symbol": ":"
       },
       {
+          "desc": "c_d",
           "isentry": true,
-          "topic.stack.desc": "c_d",
-          "topic.stack.index": 2,
-          "topic.stack.state": [
+          "node": "e629654d70505107cca3d12782d9c5a50d8fb9c8",
+          "stack_index": 2,
+          "state": [
               "clean"
           ],
-          "topic.stack.state.symbol": ":"
+          "symbol": ":"
       },
       {
+          "desc": "c_c",
           "isentry": true,
-          "topic.stack.desc": "c_c",
-          "topic.stack.index": 1,
-          "topic.stack.state": [
+          "node": "8522f9e3fee92d4ec4e688ac3fbd2ee0f8fd5036",
+          "stack_index": 1,
+          "state": [
               "clean"
           ],
-          "topic.stack.state.symbol": ":"
+          "symbol": ":"
       },
       {
+          "desc": "c_b",
           "isentry": false,
-          "topic.stack.desc": "c_b",
-          "topic.stack.index": 0,
-          "topic.stack.state": [
+          "node": "ea705abc4f51e26d356ed94b3443e8c19b76cedf",
+          "stack_index": 0,
+          "state": [
               "base"
           ],
-          "topic.stack.state.symbol": "^"
+          "symbol": "^"
       }
   ]
   $ hg stack -v -Tjson | python -m json.tool
   [
       {
+          "desc": "c_f",
           "isentry": true,
-          "topic.stack.desc": "c_f",
-          "topic.stack.index": 4,
-          "topic.stack.shortnode": "6559e6d93aea",
-          "topic.stack.state": [
+          "node": "6559e6d93aeadba940874f54f106c61931b5b8cf",
+          "stack_index": 4,
+          "state": [
               "current"
           ],
-          "topic.stack.state.symbol": "@"
+          "symbol": "@"
       },
       {
+          "desc": "c_e",
           "isentry": true,
-          "topic.stack.desc": "c_e",
-          "topic.stack.index": 3,
-          "topic.stack.shortnode": "0f9ac936c87d",
-          "topic.stack.state": [
+          "node": "0f9ac936c87d1d991011862aff4e86d0c3300a89",
+          "stack_index": 3,
+          "state": [
               "clean"
           ],
-          "topic.stack.state.symbol": ":"
+          "symbol": ":"
       },
       {
+          "desc": "c_d",
           "isentry": true,
-          "topic.stack.desc": "c_d",
-          "topic.stack.index": 2,
-          "topic.stack.shortnode": "e629654d7050",
-          "topic.stack.state": [
+          "node": "e629654d70505107cca3d12782d9c5a50d8fb9c8",
+          "stack_index": 2,
+          "state": [
               "clean"
           ],
-          "topic.stack.state.symbol": ":"
+          "symbol": ":"
       },
       {
+          "desc": "c_c",
           "isentry": true,
-          "topic.stack.desc": "c_c",
-          "topic.stack.index": 1,
-          "topic.stack.shortnode": "8522f9e3fee9",
-          "topic.stack.state": [
+          "node": "8522f9e3fee92d4ec4e688ac3fbd2ee0f8fd5036",
+          "stack_index": 1,
+          "state": [
               "clean"
           ],
-          "topic.stack.state.symbol": ":"
+          "symbol": ":"
       },
       {
+          "desc": "c_b",
           "isentry": false,
-          "topic.stack.desc": "c_b",
-          "topic.stack.index": 0,
-          "topic.stack.shortnode": "ea705abc4f51",
-          "topic.stack.state": [
+          "node": "ea705abc4f51e26d356ed94b3443e8c19b76cedf",
+          "stack_index": 0,
+          "state": [
               "base"
           ],
-          "topic.stack.state.symbol": "^"
+          "symbol": "^"
       }
   ]
 
+  $ hg stack -T '{rev}: [{branch}] [{topic}] {desc}\n'
+  5: [default] [foo] c_f
+  4: [default] [foo] c_e
+  3: [default] [foo] c_d
+  2: [default] [foo] c_c
+  1: [default] [] c_b
+
 check that topics and stack are available even if ui.strict=true
 
   $ hg topics
@@ -346,13 +358,13 @@
   s1: c_c
   s0^ c_b (base)
   $ hg topic --list --color=debug
-  [topic.stack.summary.topic|### topic: [topic.active|foo]]
-  [topic.stack.summary.branches|### target: default (branch)]
-  [topic.stack.index topic.stack.index.orphan|s4][topic.stack.state topic.stack.state.orphan|$] [topic.stack.desc topic.stack.desc.orphan|c_f][topic.stack.state topic.stack.state.orphan| (orphan)]
-  [topic.stack.index topic.stack.index.current topic.stack.index.orphan|s3][topic.stack.state topic.stack.state.current topic.stack.state.orphan|@] [topic.stack.desc topic.stack.desc.current topic.stack.desc.orphan|c_e][topic.stack.state topic.stack.state.current topic.stack.state.orphan| (current orphan)]
-  [topic.stack.index topic.stack.index.clean|s2][topic.stack.state topic.stack.state.clean|:] [topic.stack.desc topic.stack.desc.clean|c_d]
-  [topic.stack.index topic.stack.index.clean|s1][topic.stack.state topic.stack.state.clean|:] [topic.stack.desc topic.stack.desc.clean|c_c]
-  [topic.stack.index topic.stack.index.base|s0][topic.stack.state topic.stack.state.base|^] [topic.stack.desc topic.stack.desc.base|c_b][topic.stack.state topic.stack.state.base| (base)]
+  [stack.summary.topic|### topic: [topic.active|foo]]
+  [stack.summary.branches|### target: default (branch)]
+  [stack.index stack.index.orphan|s4][stack.state stack.state.orphan|$] [stack.desc stack.desc.orphan|c_f][stack.state stack.state.orphan| (orphan)]
+  [stack.index stack.index.current stack.index.orphan|s3][stack.state stack.state.current stack.state.orphan|@] [stack.desc stack.desc.current stack.desc.orphan|c_e][stack.state stack.state.current stack.state.orphan| (current orphan)]
+  [stack.index stack.index.clean|s2][stack.state stack.state.clean|:] [stack.desc stack.desc.clean|c_d]
+  [stack.index stack.index.clean|s1][stack.state stack.state.clean|:] [stack.desc stack.desc.clean|c_c]
+  [stack.index stack.index.base|s0][stack.state stack.state.base|^] [stack.desc stack.desc.base|c_b][stack.state stack.state.base| (base)]
   $ hg up s2
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
 
@@ -604,6 +616,22 @@
   s1: c_D
   s0^ c_c (base)
 
+  $ hg stack -v
+  ### topic: foobar
+  ### target: default (branch), 3 behind
+  s2(ea0f882ce093)@ c_e (current)
+                  ^ c_h
+  s1(d2f548af67ab): c_D
+  s0(8522f9e3fee9)^ c_c (base)
+
+  $ hg stack --debug
+  ### topic: foobar
+  ### target: default (branch), 3 behind
+  s2(ea0f882ce093a2ad63db49083c5cb98a24a9470e)@ c_e (current)
+                                              ^ c_h
+  s1(d2f548af67ab55b08452a3e00a539319490fcd5b): c_D
+  s0(8522f9e3fee92d4ec4e688ac3fbd2ee0f8fd5036)^ c_c (base)
+
   $ hg stack foo
   ### topic: foo
   ### target: default (branch), ambiguous rebase destination - topic 'foo' has 3 heads
--- a/tests/test-topic-tutorial.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-topic-tutorial.t	Wed Jun 05 17:46:06 2019 +0200
@@ -1369,7 +1369,7 @@
   $ hg next --evolve
   move:[s2] Adding saw
   atop:[s1] Adding hammer to the shopping list
-  working directory now at d5c51ee5762a
+  working directory is now at d5c51ee5762a
 
   $ hg stack
   ### topic: tools
@@ -1384,7 +1384,7 @@
   $ hg next --evolve
   move:[s3] Adding drill
   atop:[s2] Adding saw
-  working directory now at bae3758e46bf
+  working directory is now at bae3758e46bf
 
   $ hg stack
   ### topic: tools
--- a/tests/test-topic.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-topic.t	Wed Jun 05 17:46:06 2019 +0200
@@ -115,6 +115,11 @@
   used, the pushed revisions are published if the push succeeds. It also applies
   to common revisions selected by the push.
   
+  One can prevent any publishing to happens in a repository using:
+  
+    [experimental]
+    topic.allow-publish = no
+  
   list of commands:
   
    stack         list all changesets in a topic and other information
--- a/tests/test-touch.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-touch.t	Wed Jun 05 17:46:06 2019 +0200
@@ -54,7 +54,7 @@
   
   $ hg prune 3
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at 000000000000
+  working directory is now at 000000000000
   1 changesets pruned
 
 Duplicate
--- a/tests/test-tutorial.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-tutorial.t	Wed Jun 05 17:46:06 2019 +0200
@@ -547,7 +547,7 @@
 
   $ hg prune . # "." is for working directory parent
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory now at 41aff6a42b75
+  working directory is now at 41aff6a42b75
   1 changesets pruned
 
 The silly changeset is gone.
@@ -1379,14 +1379,13 @@
   move:[13] animals
   atop:[12] bathroom stuff
   merging shopping
-  working directory is now at 2a2b36e14660
 
 The old version of bathroom is hidden again.
 
   $ hg log -G
-  @  2a2b36e14660 (draft): animals
+  o  2a2b36e14660 (draft): animals
   |
-  o  682004e81e71 (draft): bathroom stuff
+  @  682004e81e71 (draft): bathroom stuff
   |
   o  57e9caedbcb8 (public): SPAM SPAM
   |
@@ -1399,6 +1398,11 @@
   o  7e82d3f3c2cb (public): Monthy Python Shopping list
   
 
+And let's update to the newly evolved changeset.
+
+  $ hg update
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
 #if docgraph-ext
   $ hg docgraph -r "all()" --sphinx-directive --rankdir LR #rest-ignore
   .. graphviz::
@@ -1524,6 +1528,7 @@
   update:[8] animals
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory is now at 2a2b36e14660
+  no troubled changesets
 
 Relocating unstable change after prune
 ----------------------------------------------
@@ -1673,7 +1678,7 @@
 
   $ hg prune 2a2b36e14660
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory now at 682004e81e71
+  working directory is now at 682004e81e71
   1 changesets pruned
   1 new orphan changesets
 
@@ -1830,7 +1835,10 @@
       }
 #endif
 
-  $ hg evolve
+The --update flag of `hg evolve` automatically updates to the tipmost evolved
+changeset.
+
+  $ hg evolve --update
   move:[15] SPAM SPAM SPAM
   atop:[12] bathroom stuff
   merging shopping
--- a/tests/test-uncommit-interactive.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-uncommit-interactive.t	Wed Jun 05 17:46:06 2019 +0200
@@ -449,7 +449,7 @@
 
   $ hg prune .
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory now at 42cc15efbec2
+  working directory is now at 42cc15efbec2
   1 changesets pruned
   $ hg revert --all
   undeleting a
--- a/tests/test-uncommit.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-uncommit.t	Wed Jun 05 17:46:06 2019 +0200
@@ -361,9 +361,9 @@
   b: no such file in rev 5b27f6b17da2
   [1]
 
-Test uncommiting precursors
+Test uncommiting predecessors
 
-  $ hg uncommit --hidden --rev 'precursors(.)' b --traceback
+  $ hg uncommit --hidden --rev 'predecessors(.)' b --traceback
   $ hg cat b --rev .
   b
   b
--- a/tests/test-unstability-resolution-result.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-unstability-resolution-result.t	Wed Jun 05 17:46:06 2019 +0200
@@ -85,7 +85,7 @@
   $ echo 'a' > a
   $ hg amend
   1 new orphan changesets
-  $ hg evolve
+  $ hg evolve --update
   move:[4] newer a
   atop:[5] changea
   merging a
--- a/tests/test-unstable-orphan.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-unstable-orphan.t	Wed Jun 05 17:46:06 2019 +0200
@@ -65,11 +65,10 @@
   $ hg evo --all --any --orphan
   move:[2] add _c
   atop:[3] bprime
-  working directory is now at fdcf3523a74d
   $ hg log -G
-  @  4:fdcf3523a74d@default(draft) add _c
+  o  4:fdcf3523a74d@default(draft) add _c
   |
-  o  3:36050226a9b9@default(draft) bprime
+  @  3:36050226a9b9@default(draft) bprime
   |
   o  0:135f39f4bd78@default(draft) add _a
   
@@ -117,11 +116,10 @@
   $ hg evo --all --any --orphan
   move:[2] add _c
   atop:[6] add bsecondsplit2
-  working directory is now at 98e3f21461ff
   $ hg log -G
-  @  7:98e3f21461ff@default(draft) add _c
+  o  7:98e3f21461ff@default(draft) add _c
   |
-  o  6:59b942dbda14@default(draft) add bsecondsplit2
+  @  6:59b942dbda14@default(draft) add bsecondsplit2
   |
   o  5:8ffdae67d696@default(draft) add bsecondsplit1
   |
--- a/tests/test-userguide.t	Tue Apr 23 14:18:11 2019 +0200
+++ b/tests/test-userguide.t	Wed Jun 05 17:46:06 2019 +0200
@@ -63,7 +63,7 @@
   $ hg commit -m 'debug hack'
   $ hg prune .
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory now at 934359450037
+  working directory is now at 934359450037
   1 changesets pruned
   $ hg parents --template '{rev}:{node|short}  {desc|firstline}\n'
   2:934359450037  implement feature Y
@@ -122,7 +122,7 @@
   ~
   $ hg --hidden log -q -r 'successors(05e61aab8294) | successors(be6d5bc8e4cc) | successors(35f432d9f7c1)'
   9:171c6a79a27b
-  $ hg --hidden log -q -r 'precursors(171c6a79a27b)'
+  $ hg --hidden log -q -r 'predecessors(171c6a79a27b)'
   6:05e61aab8294
   7:be6d5bc8e4cc
   8:35f432d9f7c1
@@ -179,7 +179,7 @@
   o  9:171c6a79a27b  draft  fix bug 64
   |
   ~
-  $ hg evolve -q --all
+  $ hg evolve -q --all --update
   $ hg shortlog -G -r 171c6a79a27b::
   @  15:91b4b0f8b5c5  draft  feature 23
   |
@@ -219,7 +219,7 @@
   x  17:b23d06b457a8  draft  debug hack
   |
   ~
-  $ hg evolve -q --all --any
+  $ hg evolve -q --all --any --update
   $ hg --hidden shortlog -G -r 1f33e68b18b9::
   @  19:4393e5877437  draft  more work
   |
@@ -253,7 +253,7 @@
   $ hg status
   M file2.c
   $ hg revert file2.c
-  $ hg evolve --all --any
+  $ hg evolve --all --any --update
   move:[21] fix bug 67
   atop:[22] fix bug 53
   working directory is now at 0d972d6888e6
@@ -305,7 +305,7 @@
   o  23:0d972d6888e6  draft  fix bug 67
   |
   ~
-  $ hg evolve --all --any
+  $ hg evolve --all --any --update
   move:[25] new feature
   atop:[26] fix a bug
   working directory is now at 166c1c368ab6