merge default into stable stable
authorPierre-Yves David <pierre-yves.david@fb.com>
Fri, 08 Aug 2014 23:14:00 -0700
branchstable
changeset 1048 a585353a816b
parent 1031 acc2b590edd9 (current diff)
parent 1047 d830377bf186 (diff)
child 1049 4d5d101e878f
merge default into stable Release 4.1.0 is coming
--- a/README	Fri Aug 08 15:50:26 2014 -0700
+++ b/README	Fri Aug 08 23:14:00 2014 -0700
@@ -29,9 +29,19 @@
 ==========
 
 The simplest way to contribute is to issue a pull request on Bitbucket
-(https://bitbucket.org/marmoute/mutable-history). Please don't forget
-to update and run the tests when you fix a bug or add a feature. To
-run the tests:
+(https://bitbucket.org/marmoute/mutable-history). Alternatively, you
+can use the patchbomb extension to send email to mercurial
+devel. Please make sure to use the evolve-ext flag when doing so. You
+can use a command like this:
+
+    hg email --to mercurial-devel@selenic.com --flag evolve-ext --rev '<your patches>'
+
+See also
+http://mercurial.selenic.com/wiki/ContributingChanges#Patch_descriptions
+for guidelines on the patch description.
+
+Please don't forget to update and run the tests when you fix a bug or
+add a feature. To run the tests:
 
     cd tests
     python run-tests.py --with-hg=/path/to/hg
@@ -47,6 +57,19 @@
 Changelog
 =========
 
+4.1.0 --
+
+- amend: add -D/--current-date option
+- amend: add -U/--current-user option
+- evolve: add a --tool option
+- evolve: add a --confirm option
+- mark "commit -o", "graft -o" and "graft -O" as deprecated since they are
+  unlikely to eventually make it into core.
+- push obsmarkers and phases in the same transaction than changesets
+  (when using hg >= 3.1 and bundle2-exp is enabled)
+- hide message about the obsolescence marker exchange behind a
+  `experimental.verbose-obsolescence-exchange` variable (default to False).
+
 4.0.1 -- 2014-08-08
 
 - createmarkers() accept an iterable (for compat with other extension)
--- a/debian/rules	Fri Aug 08 15:50:26 2014 -0700
+++ b/debian/rules	Fri Aug 08 23:14:00 2014 -0700
@@ -18,6 +18,7 @@
 	dh_python2
 
 clean: clean-docs
+	rm -f tests/*.err
 
 clean-docs:
 	rm -rf html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/concepts.rst	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,223 @@
+.. Copyright 2014 Greg Ward <greg@gerg.ca>
+
+----------------
+Evolve: Concepts
+----------------
+
+Getting the most out of software requires an accurate understanding of
+the concepts underlying it. For example, you cannot use Mercurial to
+its full potential without understanding the DAG (directed acyclic
+graph) of changesets and the meaning of parent/child relationships
+between nodes in that graph. Mercurial with changeset evolution adds
+some additional concepts to the graph of changesets. Understanding
+those concepts will make you an informed and empowered user of
+``evolve``.
+
+.. note:: This document contains math! If you have a pathological fear
+          of set theory and the associated notation, you might be
+          better off just reading the `user guide`_. But if you
+          appreciate the theoretical rigour underlying core Mercurial,
+          you will be happy to know that it continues right into
+          changeset evolution.
+
+.. note:: This document is incomplete! (The formatting of the math
+          isn't quite right yet, and the diagrams are missing for
+          malformatted.)
+
+This document follows standard set theory notation:
+
+  x ∈ A: x is a member of A
+
+  A ∪ B: union of A and B: { x | x ∈ A or x ∈ B }
+
+  A ∖ B: set difference: { x | x ∈ A and x ∉ B }
+
+  A ⊇ B: superset: if x ∈ B, then x ∈ A
+
+.. _`user guide`: user-guide.html
+
+Phases
+------
+
+First, every changeset in a Mercurial repository (since 2.3) has a
+*phase*. Phases are independent of ``evolve`` and they affect
+Mercurial usage with or without changeset evolution. However, they
+were implemented in order to support evolution, and are a critical
+foundation of ``evolve``.
+
+Phases are strictly ordered:
+
+  secret > draft > public
+
+Changesets generally only move from a higher phase to a lower phase.
+Typically, changesets start life in *draft* phase, and move to
+*public* phase when they are pushed to a public repository. (You can
+set the default phase of new commits in Mercurial configuration.)
+
+The purpose of phases is to prevent modifying published history.
+``evolve`` will therefore only let you rewrite changesets in one of
+the two *mutable* phases (secret or draft).
+
+Run ``hg help phases`` for more information on phases.
+
+Obsolete changesets
+-------------------
+
+*Obsolescence* is they key concept at the heart of changeset
+evolution. Everything else in this document depends on understanding
+obsolescence. So: what does it mean for a changeset to be obsolete?
+
+In implementation terms, there is an *obsolescence marker* associated
+with changesets: every changeset is either obsolete or not.
+
+The simplest way that a changeset becomes obsolete is by *pruning* it.
+The ``hg prune`` command simply marks the specified changesets
+obsolete, as long as they are mutable.
+
+More commonly, a changeset *A* becomes obsolete by *amending* it.
+Amendment creates a new changeset *A'* that replaces *A*, which is now
+obsolete. *A'* is the successor of *A*, and *A* the predecessor of *A'*:
+
+  [diagram: A and A' with pred/succ edge]
+
+The predecessor/successor relationship forms an additional
+*obsolescence graph* overlaid on top of the traditional DAG formed by
+changesets and their parent/child relationships. In fact, the
+obsolescence graph is second-order version control. Where the
+traditional parent/child DAG tracks changes to your source code, the
+obsolescence graph tracks changes to your changesets. It tracks the
+evolution of your changesets.
+
+(If you prefer a calculus metaphor to set theory, it might help to
+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)
+-------------------------------------------------
+
+Evolving history can introduce problems that need to be solved. For
+example, if you prune a changeset *P* but not its descendants, those
+descendants are now on thin ice. To push a changeset to another
+repository *R*, all of its ancestors must be present in *R* or pushed
+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*.
+
+  [diagram: obsolete cset with non-obsolete descendant]
+
+Another sort of trouble occurs when two developers, Alice and Bob,
+collaborate via a shared non-publishing repository. (This is how
+developers can safely `share mutable history`_.) Say Alice and Bob
+both start the day with changeset *C* in *draft* phase. If Alice
+pushes *C* to their public repository, then it is now published and
+therefore immutable. But Bob is working from a desert island and
+cannot pull this change in *C*'s phase. For Bob, *C* is still in draft
+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
+the successor of a public changeset.
+
+.. _`share mutable history`: sharing.html
+
+(Incidentally, the terminology here comes from airline overbooking: if
+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".)
+
+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).
+
+The collective term for unstable, bumped, and divergent changeset is
+*troubled*:
+
+  troubled = unstable ∪ bumped ∪ 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.
+
+  [diagram: Venn diagram of troubled changesets, showing overlap]
+
+The presence of troubled changesets indicates the need to run ``hg
+evolve``.
+
+Hidden (and visible) changesets
+-------------------------------
+
+Some obsolete changesets are *hidden*: deliberately suppressed by
+Mercurial and usually not visible through the UI. (As of Mercurial
+2.9, there are still some commands that inadvertently reveal hidden
+changesets; these are bugs and will be fixed in due course.)
+
+All hidden changesets are obsolete, and all obsolete changesets are
+part of your repository. Mathematically speaking:
+
+  repo ⊇ obsolete ⊇ hidden
+
+Or, putting it visually:
+
+  [diagram: Venn diagram showing nested strict subsets]
+
+However, the presence of obsolete but not hidden changesets should be
+temporary. The desired end state for any history mutation operation is
+that all obsolete changesets are hidden, i.e.:
+
+  repo ⊇ obsolete, obsolete = hidden
+
+Visually:
+
+  [diagram: Venn diagram showing obsolete = hidden, subset of repo]
+
+
+Why is this changeset visible?
+------------------------------
+
+Any changeset which is not hidden is *visible*. That is,
+
+  visible = repo ∖ hidden
+
+(Recall that ∖ means set difference: *visible* is the set of
+changesets that are in *repo* but not in *hidden*.)
+
+After amending or pruning a changeset, you might expect it to be
+hidden. It doesn't always work out that way. The precise rules are:
+
+  hideable = obsolete
+  blockers = bookmarks ∪ parents(workingcopy) ∪ localtags
+  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,
+one bookmark, a working copy, and some hidden changesets:
+
+        x-x
+       /
+  -o-o-o-o
+     \
+      x-x-o
+
+Here's the computation required to determine which changesets are
+hidden:
+
+  repo = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }
+
+  hideable = obsolete = { 2, 4, 5, 8 }
+
+  blockers = { 6 } ∪ { 4 } ∪ {}
+
+  blockers = { 4, 6 }
+
+  hidden = hideable ∖ ancestors((repo ∖ { 2, 4, 5, 8 }) ∪ { 4, 6 })
+
+  hidden = hideable ∖ ancestors({ 0, 1, 3, 6, 7 } ∪ { 4, 6 })
+
+  hidden = hideable ∖ ancestors({ 0, 1, 3, 4, 6, 7 })
+
+  hidden = { 2, 4, 5, 8 } ∖ { 0, 1, 2, 3, 4, 5, 6, 7 }
+
+  hidden = { 8 }
--- a/docs/conf.py	Fri Aug 08 15:50:26 2014 -0700
+++ b/docs/conf.py	Fri Aug 08 23:14:00 2014 -0700
@@ -12,8 +12,8 @@
 master_doc = 'index'
 
 # General substitutions.
-project = 'Obsolete experimentation'
-copyright = '2010-2011, pierre-yves.david@logilab.fr'
+project = 'evolve extension for Mercurial'
+copyright = '2010-2014, Pierre-Yves David, Greg Ward, and contributors'
 
 # The default replacements for |version| and |release|, also used in various
 # other places throughout the built documents.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug01.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,400 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="150"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug01.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3976">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3978" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3980" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3976"
+       id="linearGradient3986"
+       x1="21.490866"
+       y1="78.901947"
+       x2="53.729759"
+       y2="78.901947"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1.9995778e-6,24.148893)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="73.6273"
+     inkscape:cy="87.13832"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="976"
+     inkscape:window-height="802"
+     inkscape:window-x="18"
+     inkscape:window-y="350"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078084198px"
+       originy="-2924.5747px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780842,2022.2125)" />
+  <g
+     id="g6159"
+     transform="matrix(0.9999958,0,0,1,-382.57893,-238.18697)">
+    <rect
+       y="238.83586"
+       x="383.08054"
+       height="18.05327"
+       width="21.481829"
+       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"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="252.23067"
+         x="390.00699"
+         id="tspan5219"
+         sodipodi:role="line">0</tspan></text>
+  </g>
+  <g
+     id="g3802"
+     transform="translate(10.633744,0.14889301)">
+    <rect
+       y="0.50000465"
+       x="49.866257"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156"
+         sodipodi:role="line"
+         x="56.792801"
+         y="13.894781">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"
+     d="m 21.981735,9.6755275 38.518266,4.2e-6"
+     id="path8263"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-start="#g6159"
+     inkscape:connection-end="#g3802"
+     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"
+     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>
+  <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"
+     id="path8598"
+     inkscape:connector-curvature="0" />
+  <g
+     id="g3821"
+     transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)">
+    <path
+       inkscape:connector-curvature="0"
+       id="path8466-5"
+       d="M 35.5,23.60911 35.5,59.5"
+       style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8466-4-7"
+       d="M 33.5,23.60911 33.5,59.5"
+       style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+  <g
+     id="g6159-9"
+     transform="matrix(0.9999958,0,0,1,-382.5698,-144.46361)">
+    <rect
+       y="238.83586"
+       x="383.08054"
+       height="18.05327"
+       width="21.481829"
+       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"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="252.23067"
+         x="390.00699"
+         id="tspan5219-3"
+         sodipodi:role="line">0</tspan></text>
+  </g>
+  <g
+     id="g3916"
+     transform="translate(9.5649648e-7,23.723361)">
+    <rect
+       y="107.72337"
+       x="60.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-4"
+       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"
+       xml:space="preserve"><tspan
+         y="121.11791"
+         x="65.68634"
+         id="tspan3914"
+         sodipodi:role="line">1'</tspan></text>
+  </g>
+  <g
+     id="g3969"
+     transform="translate(4.0851082,20.999957)">
+    <path
+       transform="matrix(2.0019166,-0.33373336,0.24981576,1.1431983,-230.26746,31.077255)"
+       inkscape:transform-center-y="-0.9468898"
+       inkscape:transform-center-x="-0.82266973"
+       d="m 157.12291,94.440838 c -1.18183,1.454597 -8.91272,-1.300343 -10.79635,-1.00274 -1.88363,0.297602 -2.27986,5.900632 -3.98505,5.130533 -1.7052,-0.7701 -3.74374,-5.759198 -4.73141,-7.362338 -0.98766,-1.603141 -6.98979,-4.377117 -7.06039,-6.057672 -0.0706,-1.680555 6.93719,-0.349919 7.75648,-1.903786 0.81928,-1.553866 0.0513,-8.775377 1.58159,-9.477758 1.53031,-0.70238 3.98957,4.754872 5.63472,5.323605 1.64516,0.568733 10.20851,-0.835155 11.23768,0.484831 1.02916,1.319987 -4.3673,5.790377 -4.35486,7.530709 0.0124,1.740332 5.89943,5.880018 4.71759,7.334616 z"
+       inkscape:randomized="0.15"
+       inkscape:rounded="0.2"
+       inkscape:flatsided="false"
+       sodipodi:arg2="1.268675"
+       sodipodi:arg1="0.64035647"
+       sodipodi:r2="6.7602978"
+       sodipodi:r1="13.520596"
+       sodipodi:cy="85.499779"
+       sodipodi:cx="144.7717"
+       sodipodi:sides="5"
+       id="path3943"
+       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"
+       xml:space="preserve"><tspan
+         y="84.170212"
+         x="69.021271"
+         id="tspan3959"
+         sodipodi:role="line">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"
+     id="path3974"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end-point="d4"
+     inkscape:connection-end="#g3969"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-start="#g6159-9" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6)"
+     d="m 21.990865,110.03677 38.509136,23.79872"
+     id="path5012"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g6159-9"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g3916"
+     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"
+     x="46.760448"
+     y="58.872295"
+     id="text5223"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan5227"
+       x="46.760448"
+       y="58.872295">(destructive, not using evolve)</tspan></text>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug02.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,590 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="250"
+   height="250"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug02.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotS"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotS"
+       style="overflow:visible">
+      <path
+         id="path4196"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-9"
+       style="overflow:visible">
+      <path
+         id="path5316-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-1"
+       style="overflow:visible">
+      <path
+         id="path5316-9"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.7318511"
+     inkscape:cx="113.8845"
+     inkscape:cy="138.3052"
+     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-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078088198px"
+       originy="-2937.8154px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780882,2135.4532)" />
+  <g
+     id="g6159"
+     transform="matrix(0.9999958,0,0,1,-382.57893,-236.94626)">
+    <rect
+       y="238.83586"
+       x="383.08054"
+       height="18.05327"
+       width="21.481829"
+       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"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="252.23067"
+         x="390.00699"
+         id="tspan5219"
+         sodipodi:role="line">0</tspan></text>
+  </g>
+  <g
+     id="g3802"
+     transform="translate(10.633748,1.389597)">
+    <rect
+       y="0.50000465"
+       x="49.866257"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156"
+         sodipodi:role="line"
+         x="56.792801"
+         y="13.894781">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"
+     d="m 21.981735,10.916236 38.51827,1e-6"
+     id="path8263"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-start="#g6159"
+     inkscape:connection-end="#g3802"
+     inkscape:connection-end-point="d4" />
+  <g
+     id="g6159-9"
+     transform="matrix(1.0000075,0,0,1,-382.57429,-102.14843)">
+    <rect
+       y="238.83586"
+       x="383.08054"
+       height="18.05327"
+       width="21.481829"
+       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"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="252.23067"
+         x="390.00699"
+         id="tspan5219-3"
+         sodipodi:role="line">0</tspan></text>
+  </g>
+  <g
+     id="g4101"
+     transform="translate(3.9991556e-6,76)">
+    <rect
+       y="131.44673"
+       x="60.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-4"
+       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"
+       xml:space="preserve"><tspan
+         y="144.84122"
+         x="67.447083"
+         id="tspan3914"
+         sodipodi:role="line">3</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"
+     d="m 18.903026,154.7407 44.684935,52.70603"
+     id="path5012"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g6159-9"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4101"
+     inkscape:connection-end-point="d4" />
+  <g
+     id="g6499"
+     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"
+       xml:space="preserve"><tspan
+         y="42.826412"
+         x="46.543755"
+         id="tspan8594"
+         sodipodi:role="line">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"
+       xml:space="preserve"><tspan
+         y="54.872299"
+         x="46.760452"
+         id="tspan5227"
+         sodipodi:role="line">(safe, using evolve)</tspan></text>
+  </g>
+  <g
+     id="g4022"
+     transform="translate(3.9991556e-6,42.31518)">
+    <rect
+       y="94.372253"
+       x="60.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-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
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156-7"
+         sodipodi:role="line"
+         x="67.426567"
+         y="107.76683">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"
+     d="m 21.991109,145.71407 38.508895,0"
+     id="path8263-2"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g6159-9"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4022"
+     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"
+     x="122.10091"
+     y="140.49216"
+     id="text4115"
+     sodipodi:linespacing="125%"><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>
+  <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"
+     id="path4123"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4022"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4101"
+     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"
+     x="51.716301"
+     y="112.74194"
+     id="text4799"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801"
+       x="51.716301"
+       y="112.74194">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"
+     x="94.602974"
+     y="171.26965"
+     id="text4803"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4805"
+       x="94.602974"
+       y="171.26965">precursor</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"
+     x="94.461372"
+     y="189.68568"
+     id="text4807"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4809"
+       x="94.461372"
+       y="189.68568">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"
+     id="path5061"
+     inkscape:connector-curvature="0" />
+  <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 93.341603,186.6584 C 79.50523,184.42591 75.177832,194.04021 75.177832,205.32672"
+     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)">
+    <path
+       inkscape:connector-curvature="0"
+       id="path8598"
+       d="m 36.655934,114.93533 3.649333,6.32067 3.711171,-6.42777"
+       style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <g
+       transform="translate(0.73014858,0)"
+       id="g6489">
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1.21219063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 40.606,21.314861 0,98.078949"
+         id="path8466-5"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1.10104096;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 38.5505,21.370511 0,98.078949"
+         id="path8466-5-3"
+         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>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug03.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,402 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="150"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug03.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-7"
+       style="overflow:visible">
+      <path
+         id="path5316-3"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.4712371"
+     inkscape:cx="72.857038"
+     inkscape:cy="79.643357"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="976"
+     inkscape:window-height="802"
+     inkscape:window-x="179"
+     inkscape:window-y="330"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078084198px"
+       originy="-2924.5747px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780842,2022.2125)" />
+  <g
+     id="g6622"
+     transform="translate(0,18)">
+    <g
+       id="g6602">
+      <rect
+         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"
+         id="rect2987"
+         width="21.481739"
+         height="18.05327"
+         x="0.49999696"
+         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"
+         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>
+    </g>
+    <g
+       id="g6612">
+      <rect
+         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"
+         id="rect2987-4"
+         width="21.481739"
+         height="18.05327"
+         x="60.5"
+         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"
+         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>
+    </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" />
+  </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"
+       xml:space="preserve"><tspan
+         y="53.910118"
+         x="46.543751"
+         id="tspan8594"
+         sodipodi:role="line">hg prune .</tspan></text>
+    <g
+       id="g6372">
+      <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"
+         id="path8598"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g3821"
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)">
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-5"
+           d="M 35.5,23.60911 35.5,59.5"
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-4-7"
+           d="M 33.5,23.60911 33.5,59.5"
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      </g>
+    </g>
+  </g>
+  <g
+     id="g6607">
+    <rect
+       y="101.77834"
+       x="0.49999696"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-7"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan3904"
+         style="stroke:none"
+         y="115.1729"
+         x="7.4264359"
+         sodipodi:role="line">3</tspan></text>
+  </g>
+  <g
+     id="g6617">
+    <rect
+       y="101.77834"
+       x="60.500004"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-2"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan3908"
+         sodipodi:role="line"
+         x="67.426567"
+         y="115.1729">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"
+     id="path8263-2"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g6607"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g6617"
+     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="120.84515"
+     y="108.62753"
+     id="text4799"
+     sodipodi:linespacing="100%"><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
+       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
+       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>
+  <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"
+     x="87.810272"
+     y="8.7751856"
+     id="text4353"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4355"
+       x="87.810272"
+       y="8.7751856">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"
+     x="20.528839"
+     y="144.07831"
+     id="text4353-8"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4355-6"
+       x="20.528839"
+       y="144.07831">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"
+     id="path5792"
+     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-mid:none;marker-end:url(#Arrow2Mend-7)"
+     d="M 118.5641,115.19962 C 102.21283,112.97531 103.7629,98.729709 86.191648,105.48788"
+     id="path5986"
+     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(#Arrow2Mend-7)"
+     d="M 85.382337,4.3239755 C 75.008244,4.2518573 73.079961,8.1306941 70.814734,16.058989"
+     id="path6831"
+     inkscape:connector-curvature="0" />
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug04.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,547 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="240"
+   height="205"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug04.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotS"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotS"
+       style="overflow:visible">
+      <path
+         id="path4196"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-9"
+       style="overflow:visible">
+      <path
+         id="path5316-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-1"
+       style="overflow:visible">
+      <path
+         id="path5316-9"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.6388172"
+     inkscape:cx="115.17834"
+     inkscape:cy="50.304612"
+     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-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078090195px"
+       originy="-3032.6372px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780902,2185.275)" />
+  <g
+     id="g4373"
+     transform="translate(1.9967556e-6,-0.17817035)">
+    <rect
+       y="1.3195724"
+       x="0.4999969"
+       height="18.05327"
+       width="21.481733"
+       id="rect2987"
+       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"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="14.714343"
+         x="7.426435"
+         id="tspan5219"
+         sodipodi:role="line">3</tspan></text>
+  </g>
+  <g
+     id="g4378"
+     transform="translate(1.9967556e-6,-0.17817035)">
+    <rect
+       y="1.3195724"
+       x="60.499989"
+       height="18.05327"
+       width="21.481733"
+       id="rect2987-4"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156"
+         sodipodi:role="line"
+         x="67.426567"
+         y="14.714343">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"
+     d="m 21.981731,10.168036 38.518259,10e-7"
+     id="path8263"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0" />
+  <g
+     id="g4383"
+     transform="translate(1.9967556e-6,-36.178171)">
+    <g
+       transform="matrix(1.0000072,0,0,1,-382.57418,-102.71846)"
+       id="g6159-9">
+      <rect
+         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"
+         id="rect2987-41"
+         width="21.481829"
+         height="18.05327"
+         x="383.08054"
+         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"
+         x="390.00699"
+         y="252.23067"
+         id="text5217-7"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan5219-3"
+           x="390.00699"
+           y="252.23067"
+           style="stroke:none">3</tspan></text>
+    </g>
+  </g>
+  <g
+     id="g4395"
+     transform="translate(1.9967556e-6,-36.178171)">
+    <g
+       transform="translate(4.0689943e-6,75.42997)"
+       id="g4101">
+      <rect
+         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"
+         id="rect2987-4-4"
+         width="21.481739"
+         height="18.05327"
+         x="60.5"
+         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"
+         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>
+    </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"
+     d="m 18.903021,117.9925 44.684942,52.70603"
+     id="path5012"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end="#g4395"
+     inkscape:connection-end-point="d4"
+     inkscape:connection-start="#g4383"
+     inkscape:connection-start-point="d4" />
+  <g
+     id="g4389"
+     transform="translate(1.9967556e-6,-36.178171)">
+    <g
+       transform="translate(4.0689943e-6,41.74515)"
+       id="g4022">
+      <rect
+         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"
+         id="rect2987-4-0"
+         width="21.481739"
+         height="18.05327"
+         x="60.5"
+         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"
+         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>
+    </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"
+     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"
+     x="122.10089"
+     y="139.74393"
+     id="text4115"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4117"
+       x="122.10089"
+       y="139.74393" /></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"
+     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"
+     x="131.67636"
+     y="97.973274"
+     id="text4799"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801"
+       x="131.67636"
+       y="97.973274">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"
+     x="94.602959"
+     y="134.52141"
+     id="text4803"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4805"
+       x="94.602959"
+       y="134.52141">precursor</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"
+     x="94.461357"
+     y="152.93744"
+     id="text4807"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4809"
+       x="94.461357"
+       y="152.93744">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"
+     id="path5061"
+     inkscape:connector-curvature="0" />
+  <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 93.341579,149.9102 C 79.50521,147.67771 75.177813,157.29201 75.177813,168.57852"
+     id="path5263"
+     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"
+     x="131.8273"
+     y="14.09236"
+     id="text4799-8"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801-4"
+       x="131.8273"
+       y="14.09236">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"
+     x="133.3548"
+     y="177.91992"
+     id="text4799-8-1"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       x="133.3548"
+       y="177.91992"
+       id="tspan3129">working dir</tspan><tspan
+       sodipodi:role="line"
+       x="133.3548"
+       y="190.41992"
+       id="tspan3137">(with uncommitted</tspan><tspan
+       sodipodi:role="line"
+       x="133.3548"
+       y="202.91992"
+       id="tspan3135">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"
+     id="path4609"
+     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 127.70873,95.185669 C 112.22803,107.58577 114.03479,115.58851 86.023391,109.58606"
+     id="path5019"
+     inkscape:connector-curvature="0" />
+  <g
+     id="g5433"
+     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"
+       xml:space="preserve"><tspan
+         y="58.841717"
+         x="46.92271"
+         id="tspan8594"
+         sodipodi:role="line">hg uncommit <tspan
+   id="tspan3131"
+   style="font-style:italic">f1 f2 ...</tspan></tspan></text>
+    <g
+       transform="translate(-0.59241834,4.9316169)"
+       id="g6372">
+      <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"
+         id="path8598-5"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g3821"
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)">
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-5-0"
+           d="M 35.5,23.60911 35.5,59.5"
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-4-7"
+           d="M 33.5,23.60911 33.5,59.5"
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      </g>
+    </g>
+  </g>
+  <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 129.98248,191.8189 C 105.83194,202.48442 106.0295,178.82045 86.402349,177.41851"
+     id="path5443"
+     inkscape:connector-curvature="0" />
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug05.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,723 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="300"
+   height="250"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug05.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotS"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotS"
+       style="overflow:visible">
+      <path
+         id="path4196"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-9"
+       style="overflow:visible">
+      <path
+         id="path5316-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-1"
+       style="overflow:visible">
+      <path
+         id="path5316-9"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-3"
+       style="overflow:visible">
+      <path
+         id="path5316-7-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4448"
+       style="overflow:visible">
+      <path
+         id="path4450"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-0"
+       style="overflow:visible">
+      <path
+         id="path4193-1"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-4"
+       style="overflow:visible">
+      <path
+         id="path4193-5"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.5123284"
+     inkscape:cx="139.72657"
+     inkscape:cy="132.43442"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="974"
+     inkscape:window-height="1048"
+     inkscape:window-x="73"
+     inkscape:window-y="50"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078088198px"
+       originy="-2937.8154px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780882,2135.4532)" />
+  <g
+     id="g3155">
+    <rect
+       y="1.4467304"
+       x="0.49999774"
+       height="18.053268"
+       width="21.481806"
+       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"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="14.841532"
+         x="7.4264469"
+         id="tspan5219"
+         sodipodi:role="line">6</tspan></text>
+  </g>
+  <g
+     id="g3160">
+    <g
+       transform="matrix(1.0000031,0,0,0.99999992,-8.1553343e-7,-0.44287016)"
+       id="g3102">
+      <rect
+         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"
+         id="rect2987-4"
+         width="21.481739"
+         height="18.05327"
+         x="60.500004"
+         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"
+         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>
+    </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"
+     d="m 21.981805,10.473365 38.518392,1e-6"
+     id="path8263"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0" />
+  <g
+     id="g4516"
+     transform="translate(-0.00911713,4.7593041)">
+    <rect
+       y="136.68742"
+       x="0.50911897"
+       height="18.05327"
+       width="21.481989"
+       id="rect2987-41"
+       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"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="150.08279"
+         x="7.3916588"
+         id="tspan5219-3"
+         sodipodi:role="line">6</tspan></text>
+  </g>
+  <g
+     id="g4533"
+     transform="translate(-48.885537,0)">
+    <rect
+       y="218.81546"
+       x="109.38554"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-4"
+       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"
+       xml:space="preserve"><tspan
+         y="232.20978"
+         x="112.22823"
+         id="tspan3914"
+         sodipodi:role="line">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"
+     d="m 18.241201,159.5 45.999463,59.31546"
+     id="path5012"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4516"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4533"
+     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"
+     x="122.10091"
+     y="140.49216"
+     id="text4115"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4117"
+       x="122.10091"
+       y="140.49216" /></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"
+     id="path4123"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end="#g4533"
+     inkscape:connection-end-point="d4"
+     inkscape:connection-start="#g4837"
+     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"
+     x="145.71631"
+     y="120.74194"
+     id="text4799"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       x="145.71631"
+       y="120.74194"
+       id="tspan4866">obsolete, hidden precursors</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"
+     x="140.08366"
+     y="221.99774"
+     id="text4807"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4809"
+       x="140.08366"
+       y="221.99774">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"
+       xml:space="preserve"><tspan
+         y="75.774689"
+         x="46.543758"
+         id="tspan8594"
+         sodipodi:role="line">hg fold 7</tspan></text>
+    <g
+       transform="translate(1.9995778e-6,1.240701)"
+       id="g6493">
+      <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.655934,114.93533 3.649333,6.32067 3.711171,-6.42777"
+         id="path8598"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g6489"
+         transform="translate(0.73014858,0)">
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-5"
+           d="m 40.606,21.314861 0,98.078949"
+           style="fill:none;stroke:#808080;stroke-width:1.21219063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-5-3"
+           d="m 38.5505,21.370511 0,98.078949"
+           style="fill:none;stroke:#808080;stroke-width:1.10104096;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      </g>
+    </g>
+  </g>
+  <g
+     id="g3166">
+    <g
+       id="g3102-9"
+       transform="translate(59.999995,-0.442871)">
+      <rect
+         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"
+         id="rect2987-4-02"
+         width="21.481739"
+         height="18.05327"
+         x="60.500004"
+         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"
+         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>
+    </g>
+  </g>
+  <g
+     id="g3172">
+    <g
+       id="g3102-8"
+       transform="translate(120,-0.442871)">
+      <rect
+         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"
+         id="rect2987-4-026"
+         width="21.481739"
+         height="18.05327"
+         x="60.500004"
+         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"
+         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>
+    </g>
+  </g>
+  <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 81.981996,10.473366 38.518004,0"
+     id="path3178"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g3160"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g3166"
+     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"
+     id="path3180"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g3166"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g3172"
+     inkscape:connection-end-point="d4" />
+  <g
+     id="g4837">
+    <rect
+       y="141.44673"
+       x="60.5"
+       height="18.053268"
+       width="21.481806"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156-7"
+         sodipodi:role="line"
+         x="67.426483"
+         y="154.84146">7</tspan></text>
+  </g>
+  <g
+     id="g4842">
+    <rect
+       y="141.44673"
+       x="120.49981"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-02-9"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156-9-5"
+         sodipodi:role="line"
+         x="127.42651"
+         y="154.84122">8</tspan></text>
+  </g>
+  <g
+     id="g4847">
+    <rect
+       y="141.44673"
+       x="180.49982"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-026-9"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156-0-8"
+         sodipodi:role="line"
+         x="187.42664"
+         y="154.84122">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"
+     d="m 81.981806,150.47337 38.518004,0"
+     id="path3178-7"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4837"
+     inkscape:connection-start-point="d4"
+     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"
+     id="path3180-3"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4842"
+     inkscape:connection-start-point="d4"
+     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"
+     d="M 21.981991,150.47336 60.5,150.47337"
+     id="path4542"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4516"
+     inkscape:connection-start-point="d4"
+     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"
+     d="M 124.24048,159.5 78.241066,218.81546"
+     id="path4123-2"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4842"
+     inkscape:connection-start-point="d4"
+     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"
+     d="M 180.49982,157.39844 81.981738,220.91702"
+     id="path4123-2-7"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4847"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4533"
+     inkscape:connection-end-point="d4" />
+  <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 160.40897,123.42419 c 2.57952,11.70065 19.72743,7.53006 26.27045,14.72737"
+     id="path5710"
+     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(#marker4448)"
+     d="m 152.05019,123.02615 c -18.20742,12.2407 -49.96313,3.854 -68.064354,15.92149"
+     id="path5714"
+     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(#marker4448)"
+     d="m 155.63252,123.42419 c -3.55115,8.6397 -12.38945,8.51306 -17.91167,13.53326"
+     id="path5716"
+     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(#marker4448)"
+     d="m 152.44822,224.92366 c -12.26234,20.49653 -41.95881,1.63236 -63.685938,3.1843"
+     id="path5926"
+     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"
+     x="219.76105"
+     y="45.381439"
+     id="text4799-8"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801-4"
+       x="219.76105"
+       y="45.381439">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"
+     id="path6377"
+     inkscape:connector-curvature="0" />
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug06.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,851 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="275"
+   height="310"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug06.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotS"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotS"
+       style="overflow:visible">
+      <path
+         id="path4196"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-9"
+       style="overflow:visible">
+      <path
+         id="path5316-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-1"
+       style="overflow:visible">
+      <path
+         id="path5316-9"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-3"
+       style="overflow:visible">
+      <path
+         id="path5316-7-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4448"
+       style="overflow:visible">
+      <path
+         id="path4450"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-0"
+       style="overflow:visible">
+      <path
+         id="path4193-1"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-4"
+       style="overflow:visible">
+      <path
+         id="path4193-5"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-37"
+       style="overflow:visible">
+      <path
+         id="path5316-7-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3150"
+       style="overflow:visible">
+      <path
+         id="path3152"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-7"
+       style="overflow:visible">
+      <path
+         id="path5316-7-50"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-8"
+       style="overflow:visible">
+      <path
+         id="path4193-53"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="124.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-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078088198px"
+       originy="-2937.8154px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </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"
+     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>
+  <g
+     id="g6493"
+     transform="translate(63.844066,39.240701)">
+    <path
+       inkscape:connector-curvature="0"
+       id="path8598"
+       d="m 36.655934,114.93533 3.649333,6.32067 3.711171,-6.42777"
+       style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <g
+       transform="translate(0.73014858,0)"
+       id="g6489">
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1.21219063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 40.606,21.314861 0,98.078949"
+         id="path8466-5"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1.10104096;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 38.5505,21.370511 0,98.078949"
+         id="path8466-5-3"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780882,2195.4532)" />
+  <rect
+     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"
+     id="rect2987"
+     width="21.481806"
+     height="18.053268"
+     x="0.49999774"
+     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"
+     x="3.3424675"
+     y="48.84153"
+     id="text5217"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan5219"
+       x="3.3424675"
+       y="48.84153"
+       style="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"
+     width="21.481806"
+     height="18.053268"
+     x="60.500191"
+     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"
+     x="63.497932"
+     y="48.84153"
+     id="text5217-8"
+     sodipodi:linespacing="125%"><tspan
+       y="48.84153"
+       x="63.497932"
+       sodipodi:role="line"
+       id="tspan6156">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"
+     d="m 21.981805,44.473365 38.518386,10e-7"
+     id="path8263"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end="#rect2987-4"
+     inkscape:connection-end-point="d4" />
+  <g
+     id="g3291"
+     transform="translate(0,34)">
+    <rect
+       y="141.44673"
+       x="0.50000185"
+       height="18.05327"
+       width="21.481989"
+       id="rect2987-41"
+       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"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="154.84212"
+         x="3.3424876"
+         id="tspan5219-3"
+         sodipodi:role="line">10</tspan></text>
+  </g>
+  <rect
+     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"
+     id="rect2987-4-4"
+     width="21.481739"
+     height="18.05327"
+     x="60.5"
+     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"
+     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>
+  <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"
+     d="m 18.241201,193.5 45.999463,59.31546"
+     id="path5012"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end="#rect2987-4-4"
+     inkscape:connection-end-point="d4"
+     inkscape:connection-start="#g3291"
+     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"
+     x="122.10091"
+     y="174.49216"
+     id="text4115"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4117"
+       x="122.10091"
+       y="174.49216" /></text>
+  <g
+     id="g3118"
+     transform="translate(0,34)">
+    <rect
+       y="1.4467307"
+       x="120.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-02"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156-9"
+         sodipodi:role="line"
+         x="123.54487"
+         y="14.841505">12</tspan></text>
+  </g>
+  <g
+     id="g3126"
+     transform="translate(0,34)">
+    <rect
+       y="1.4467307"
+       x="180.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-026"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156-0"
+         sodipodi:role="line"
+         x="183.42488"
+         y="14.841505">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"
+     d="m 81.981997,44.473366 38.518003,0"
+     id="path3178"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#rect2987-4"
+     inkscape:connection-start-point="d4"
+     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"
+     d="m 141.98174,44.473366 38.51826,0"
+     id="path3180"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g3118"
+     inkscape:connection-start-point="d4"
+     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"
+     d="M 21.981991,184.65238 60.5,185.29435"
+     id="path4542"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g3291"
+     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"
+     x="86.768402"
+     y="12.367264"
+     id="text4799-8"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801-4"
+       x="86.768402"
+       y="12.367264">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"
+     transform="translate(0,34)"><flowRegion
+       id="flowRegion3106"><rect
+         id="rect3108"
+         width="60.309383"
+         height="49.300529"
+         x="-25.368233"
+         y="-22.34952" /></flowRegion><flowPara
+       id="flowPara3110"></flowPara></flowRoot>  <g
+     id="g5560"
+     transform="translate(0,34)">
+    <rect
+       y="141.44673"
+       x="60.5"
+       height="18.053268"
+       width="21.481806"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156-4"
+         sodipodi:role="line"
+         x="63.497734"
+         y="154.84152">11</tspan></text>
+  </g>
+  <g
+     transform="translate(-2.0371355e-4,174)"
+     id="g3118-0">
+    <rect
+       y="1.4467307"
+       x="120.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-02-4"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156-9-7"
+         sodipodi:role="line"
+         x="123.54487"
+         y="14.841505">12</tspan></text>
+  </g>
+  <g
+     transform="translate(-2.0371355e-4,174)"
+     id="g3126-3">
+    <rect
+       y="1.4467307"
+       x="180.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-026-8"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156-0-0"
+         sodipodi:role="line"
+         x="183.42488"
+         y="14.841505">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"
+     d="m 81.981806,184.47337 38.517994,0"
+     id="path3178-0"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     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"
+     id="path3180-2"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g3118-0"
+     inkscape:connection-start-point="d4"
+     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"
+     d="m 71.240899,193.5 -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" />
+  <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"
+     x="18.790892"
+     y="142.23888"
+     id="text4799-8-6"
+     sodipodi:linespacing="100%"><tspan
+       sodipodi:role="line"
+       id="tspan4801-4-0"
+       x="18.790892"
+       y="142.23888">obsolete</tspan><tspan
+       sodipodi:role="line"
+       x="18.790892"
+       y="152.23888"
+       id="tspan4452">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"
+     x="150.66776"
+     y="148.39902"
+     id="text4454"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4456"
+       x="150.66776"
+       y="148.39902">unstable</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"
+     id="path4880"
+     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(#marker3230);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="m 171.59383,151.74719 c -5.21207,17.59198 -29.77875,-3.6088 -34.31876,17.57791"
+     id="path5100"
+     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(#marker3230);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     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"
+     x="95.495201"
+     y="291.81802"
+     id="text4799-8-7"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801-4-8"
+       x="95.495201"
+       y="291.81802">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"
+     id="path6974"
+     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 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>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug07.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,608 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="310"
+   height="220"
+   id="svg8082"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug07.svg">
+  <defs
+     id="defs8084">
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible">
+      <path
+         id="path4117"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8231"
+       style="overflow:visible">
+      <path
+         id="path8233"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8239"
+       style="overflow:visible">
+      <path
+         id="path8241"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4448"
+       style="overflow:visible">
+      <path
+         id="path4450"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4448-9"
+       style="overflow:visible">
+      <path
+         id="path4450-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4448-8"
+       style="overflow:visible">
+      <path
+         id="path4450-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-6"
+       style="overflow:visible">
+      <path
+         id="path4193-5"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-7"
+       style="overflow:visible">
+      <path
+         id="path4193-7"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="126.91408"
+     inkscape:cy="102.44906"
+     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-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata8087">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     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"
+       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>
+    <g
+       id="g6372"
+       transform="translate(63.844068,-32.28608)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8598"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <g
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)"
+         id="g3821">
+        <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 35.5,23.60911 35.5,59.5"
+           id="path8466-5"
+           inkscape:connector-curvature="0" />
+        <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 33.5,23.60911 33.5,59.5"
+           id="path8466-4-7"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g3291"
+       transform="translate(0,-82.02573)">
+      <rect
+         y="141.44673"
+         x="0.50000185"
+         height="18.05327"
+         width="21.481989"
+         id="rect2987-41"
+         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"
+         xml:space="preserve"><tspan
+           style="stroke:none"
+           y="154.84212"
+           x="3.3424876"
+           id="tspan5219-3"
+           sodipodi:role="line">10</tspan></text>
+    </g>
+    <rect
+       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"
+       id="rect2987-4-4"
+       width="21.481739"
+       height="18.05327"
+       x="60.5"
+       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"
+       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>
+    <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"
+       d="M 18.241201,77.474272 64.240665,136.78973"
+       id="path5012"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#rect2987-4-4"
+       inkscape:connection-end-point="d4"
+       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"
+       d="M 21.981991,68.626653 60.499999,69.26862"
+       id="path4542"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3291"
+       inkscape:connection-start-point="d4" />
+    <g
+       id="g5560"
+       transform="translate(0,-82.02573)">
+      <rect
+         y="141.44673"
+         x="60.5"
+         height="18.053268"
+         width="21.481806"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-4"
+           sodipodi:role="line"
+           x="63.497734"
+           y="154.84152">11</tspan></text>
+    </g>
+    <g
+       id="g8702"
+       transform="translate(0,-16)">
+      <rect
+         y="75.421013"
+         x="120.49979"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-4"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-7"
+           sodipodi:role="line"
+           x="123.54466"
+           y="88.815628">12</tspan></text>
+    </g>
+    <g
+       id="g8707"
+       transform="translate(0,-16)">
+      <rect
+         y="75.421013"
+         x="180.4998"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026-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
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-0"
+           sodipodi:role="line"
+           x="183.42468"
+           y="88.815628">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"
+       d="m 81.981809,68.44765 38.517981,-2e-6"
+       id="path3178-0"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       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"
+       id="path3180-2"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8702"
+       inkscape:connection-start-point="d4"
+       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"
+       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"
+       transform="translate(0,-36)"><flowRegion
+         id="flowRegion8396"><rect
+           id="rect8398"
+           width="311.2373"
+           height="172.50397"
+           x="13.690791"
+           y="268.24911" /></flowRegion><flowPara
+         id="flowPara8400" /></flowRoot>    <g
+       id="g8798"
+       transform="translate(28.427001,-38.337945)">
+      <rect
+         y="175.12769"
+         x="92.072998"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-4-9"
+         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"
+         xml:space="preserve"><tspan
+           y="188.52202"
+           x="94.915642"
+           id="tspan3914-6"
+           sodipodi:role="line">16</tspan></text>
+    </g>
+    <g
+       id="g8803"
+       transform="translate(8.4270009,-38.337945)">
+      <rect
+         y="175.12769"
+         x="172.073"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-4-4"
+         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"
+         xml:space="preserve"><tspan
+           y="188.52202"
+           x="174.91582"
+           id="tspan3914-1"
+           sodipodi:role="line">17</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"
+       d="m 81.981739,145.81637 38.518261,0"
+       id="path4542-5"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#rect2987-4-4"
+       inkscape:connection-start-point="d4"
+       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"
+       d="M 141.98174,145.77795 180.5,145.64016"
+       id="path4542-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       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"
+       d="m 131.24068,77.474283 1.6e-4,59.315457"
+       id="path4123-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8702"
+       inkscape:connection-start-point="d4"
+       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"
+       d="m 191.24069,77.474283 1.6e-4,59.315457"
+       id="path4123-14"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8707"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g8803"
+       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"
+       x="226.23938"
+       y="81.810745"
+       id="text3058"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3060"
+         x="226.23938"
+         y="81.810745">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"
+       x="243.1927"
+       y="151.52931"
+       id="text6402"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6404"
+         x="243.1927"
+         y="151.52931">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"
+       x="102"
+       y="184.34302"
+       id="text7020"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan7022"
+         x="102"
+         y="184.34302">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"
+       id="path7862"
+       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(#marker4448-8);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 240,149.34301 c -2.15495,-0.66255 -7.61688,0.38312 -9,-1 -11.39271,-11.39271 -10.31018,-6 -25.5,-6"
+       id="path7864"
+       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"
+       d="m 51.5,159.34301 c -0.275757,4.62088 1.079227,8.02641 5.5,9.5 11.41327,3.80442 21.457711,-0.70846 32.500001,1.5 27.298709,5.45974 71.848979,-2 99.499999,-2 8.52242,0 22,4.51185 22,-8.5"
+       id="path8084"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug08.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="250"
+   height="190"
+   id="svg8392"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug08.svg">
+  <defs
+     id="defs8394">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8414"
+       style="overflow:visible">
+      <path
+         id="path8416"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-7"
+       style="overflow:visible">
+      <path
+         id="path5316-7-1"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695"
+       style="overflow:visible">
+      <path
+         id="path8697"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695-6"
+       style="overflow:visible">
+      <path
+         id="path8697-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="95.232262"
+     inkscape:cy="117.91553"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="824"
+     inkscape:window-height="830"
+     inkscape:window-x="647"
+     inkscape:window-y="278"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata8397">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-769.99805)">
+    <g
+       id="g8678"
+       transform="translate(0,-6)">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">18</tspan></text>
+    </g>
+    <g
+       id="g3118"
+       transform="translate(-60.000001,786.36218)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-9"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">19</tspan></text>
+    </g>
+    <g
+       id="g3126"
+       transform="translate(-60.000192,786.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-0"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">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"
+       d="m 21.981806,796.83549 38.518193,4e-5"
+       id="path3178"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3118"
+       inkscape:connection-end-point="d4"
+       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"
+       id="path3180"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3126"
+       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"
+       x="192.95625"
+       y="783.27075"
+       id="text4799-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan4801-4"
+         x="192.95625"
+         y="783.27075">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"
+       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>
+    <g
+       id="g6372"
+       transform="translate(31.315375,797.54535)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8598"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <g
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)"
+         id="g3821">
+        <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 35.5,23.60911 35.5,59.5"
+           id="path8466-5"
+           inkscape:connector-curvature="0" />
+        <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 33.5,23.60911 33.5,59.5"
+           id="path8466-4-7"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,-8.2080488e-7,99.00007)"
+       id="g8678-6">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-8"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">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"
+       id="rect2987-4-02-6"
+       width="21.481808"
+       height="18.053268"
+       x="60.5"
+       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"
+       x="63.544647"
+       y="906.20331"
+       id="text5217-8-72-1"
+       sodipodi:linespacing="125%"><tspan
+         y="906.20331"
+         x="63.544647"
+         sodipodi:role="line"
+         id="tspan6156-9-8">19</tspan></text>
+    <g
+       id="g3126-8"
+       transform="matrix(1.0000032,0,0,0.99999991,-60.000385,891.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026-7"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">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"
+       d="m 21.981875,901.83548 38.518126,5e-5"
+       id="path3178-9"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       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"
+       d="m 81.981808,901.83554 38.518382,0"
+       id="path3180-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3126-8"
+       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"
+       x="33.872818"
+       y="941.35645"
+       id="text9295"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan9297"
+         x="33.872818"
+         y="941.35645">obsolete</tspan><tspan
+         sodipodi:role="line"
+         x="33.872818"
+         y="953.85645"
+         id="tspan9299">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"
+       x="125.75282"
+       y="939.66284"
+       id="text9301"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan9303"
+         x="125.75282"
+         y="939.66284">unstable</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"
+       x="192.95625"
+       y="920.7381"
+       id="text4799-8-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan4801-4-2"
+         x="192.95625"
+         y="920.7381">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"
+       id="path9349"
+       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(#marker8695);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 189.55807,918.25683 c -26.25288,-3.51598 -8.22083,-22.5684 -39.59798,-18.38478"
+       id="path9349-7"
+       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(#marker8695-6);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 57.275649,931.10377 c 1.651424,-10.44392 15.963695,-1.81375 16.970563,-15.9099"
+       id="path9569"
+       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(#marker8695-6);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 147.43176,929.68956 c -3.24422,-11.34319 -17.24529,-1.56955 -19.09188,-14.49569"
+       id="path9957"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug09.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,307 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="250"
+   height="150"
+   id="svg10360"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug09.svg">
+  <defs
+     id="defs10362">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker10584"
+       style="overflow:visible">
+      <path
+         id="path10586"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.180467"
+     inkscape:cx="119.78971"
+     inkscape:cy="57.203827"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="866"
+     inkscape:window-height="800"
+     inkscape:window-x="548"
+     inkscape:window-y="176"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata10365">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     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"
+       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>
+    <g
+       id="g6372"
+       transform="translate(82.830913,-142.84994)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8598"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <g
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)"
+         id="g3821">
+        <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 35.5,23.60911 35.5,59.5"
+           id="path8466-5"
+           inkscape:connector-curvature="0" />
+        <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 33.5,23.60911 33.5,59.5"
+           id="path8466-4-7"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,52.986844,-844.35614)"
+       id="g8678-6">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-8"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">18</tspan></text>
+    </g>
+    <g
+       id="g11168"
+       transform="translate(0,112)">
+      <rect
+         y="-162.54732"
+         x="113.48685"
+         height="18.053268"
+         width="21.481808"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-8"
+           sodipodi:role="line"
+           x="116.53148"
+           y="-149.15291">19</tspan></text>
+    </g>
+    <g
+       id="g11163"
+       transform="translate(0,112)">
+      <rect
+         y="-162.5473"
+         x="173.48705"
+         height="18.053268"
+         width="21.481808"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9"
+           sodipodi:role="line"
+           x="176.41162"
+           y="-149.15244">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"
+       d="m 74.96872,-41.52073 38.51813,3.7e-5"
+       id="path3178-9"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g11168"
+       inkscape:connection-end-point="d4"
+       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"
+       d="m 134.96865,-41.520681 38.5184,1e-5"
+       id="path3180-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g11168"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g11163"
+       inkscape:connection-end-point="d4" />
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,172.98684,-795.29459)"
+       id="g8678-6-4">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-8-9"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">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)"
+       d="M 74.96872,-37.129348 173.48684,3.1494178"
+       id="path11202"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4"
+       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"
+       d="m 184.22792,-32.494034 -1.1e-4,31.0082104"
+       id="path4123-2"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g11163"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g8678-6-4"
+       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"
+       x="188.27898"
+       y="-68.730186"
+       id="text11674"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan11676"
+         x="188.27898"
+         y="-68.730186">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"
+       x="229.09592"
+       y="4.1899796"
+       id="text11678"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan11680"
+         x="229.09592"
+         y="4.1899796">successor,</tspan><tspan
+         sodipodi:role="line"
+         x="229.09592"
+         y="16.68998"
+         id="tspan11682">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"
+       id="path11688"
+       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(#marker10584);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 230.01314,-64.60262 c -9.90102,12.73442 -31.46298,0.0328 -40.81693,11.46543"
+       id="path12074"
+       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(#marker10584);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 225.88558,-65.97848 c -32.80764,7.84904 -73.26593,-8.64954 -95.3924,11.46544"
+       id="path12076"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug10.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,872 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="300"
+   height="400"
+   id="svg8392"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug10.svg">
+  <defs
+     id="defs8394">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8414"
+       style="overflow:visible">
+      <path
+         id="path8416"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-7"
+       style="overflow:visible">
+      <path
+         id="path5316-7-1"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695"
+       style="overflow:visible">
+      <path
+         id="path8697"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695-6"
+       style="overflow:visible">
+      <path
+         id="path8697-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-5"
+       style="overflow:visible">
+      <path
+         id="path5316-7-0"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-2"
+       style="overflow:visible">
+      <path
+         id="path4193-0"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-1"
+       style="overflow:visible">
+      <path
+         id="path5316-7-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3338"
+       style="overflow:visible">
+      <path
+         id="path3340"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3342"
+       style="overflow:visible">
+      <path
+         id="path3344"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-3"
+       style="overflow:visible">
+      <path
+         id="path4193-8"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.2724663"
+     inkscape:cx="124.3132"
+     inkscape:cy="243.92715"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="923"
+     inkscape:window-height="1064"
+     inkscape:window-x="106"
+     inkscape:window-y="54"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata8397">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-559.99805)">
+    <g
+       id="g8678"
+       transform="translate(0,-214)">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">21</tspan></text>
+    </g>
+    <g
+       id="g3118"
+       transform="translate(-60.000001,578.36218)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-9"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">22</tspan></text>
+    </g>
+    <g
+       id="g3126"
+       transform="translate(-60.000192,578.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-0"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">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"
+       d="m 21.981806,588.83549 38.518193,4e-5"
+       id="path3178"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3118"
+       inkscape:connection-end-point="d4"
+       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"
+       id="path3180"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3126"
+       inkscape:connection-end-point="d4" />
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,-8.2080488e-7,-108.99993)"
+       id="g8678-6">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-8"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">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"
+       id="rect2987-4-02-6"
+       width="21.481808"
+       height="18.053268"
+       x="60.5"
+       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"
+       x="63.544647"
+       y="698.20331"
+       id="text5217-8-72-1"
+       sodipodi:linespacing="125%"><tspan
+         y="698.20331"
+         x="63.544647"
+         sodipodi:role="line"
+         id="tspan6156-9-8">22</tspan></text>
+    <g
+       id="g3126-8"
+       transform="matrix(1.0000032,0,0,0.99999991,-60.000385,683.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026-7"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">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"
+       d="m 21.981875,693.83548 38.518126,5e-5"
+       id="path3178-9"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       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"
+       d="m 81.981808,693.83554 38.518382,0"
+       id="path3180-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3126-8"
+       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="7.5114212"
+       y="652.66315"
+       id="text9295"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan9297"
+         x="7.5114212"
+         y="652.66315">obsolete</tspan><tspan
+         sodipodi:role="line"
+         x="7.5114212"
+         y="662.66315"
+         id="tspan9299">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"
+       x="155.24913"
+       y="668.43335"
+       id="text9301"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan9303"
+         x="155.24913"
+         y="668.43335">unstable</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"
+         xml:space="preserve"><tspan
+           y="58.841717"
+           x="46.92271"
+           id="tspan8594"
+           sodipodi:role="line">hg uncommit <tspan
+   id="tspan3131"
+   style="font-style:italic">f1 f2 ...</tspan></tspan></text>
+      <g
+         transform="translate(-0.59241834,4.9316169)"
+         id="g6372-4">
+        <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"
+           id="path8598-5"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g3821-3"
+           transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)">
+          <path
+             inkscape:connector-curvature="0"
+             id="path8466-5-0"
+             d="M 35.5,23.60911 35.5,59.5"
+             style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8466-4-7-7"
+             d="M 33.5,23.60911 33.5,59.5"
+             style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        </g>
+      </g>
+    </g>
+    <g
+       id="g3118-2"
+       transform="translate(-60.000001,733.29305)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-8"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-3"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">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"
+       x="187.68906"
+       y="740.26349"
+       id="text3218"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3220"
+         x="187.68906"
+         y="740.26349">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="187.68906"
+         y="750.26349"
+         id="tspan4379">(with uncommitted</tspan><tspan
+         sodipodi:role="line"
+         x="187.68906"
+         y="760.26349"
+         id="tspan4381">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"
+       d="m 21.981875,702.7739 38.518124,32.05414"
+       id="path3178-9-5"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4"
+       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"
+       d="m 71.240897,702.86217 -2.2e-5,31.87761"
+       id="path4123"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#rect2987-4-02-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2"
+       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"
+       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
+   id="tspan3314"
+   style="font-style:italic">f1 f2 ...</tspan></tspan><tspan
+         id="tspan3322"
+         sodipodi:role="line"
+         x="79.694885"
+         y="806.03015">hg evolve --all</tspan></text>
+    <g
+       id="g6372-4-2"
+       transform="translate(32.179684,745.12164)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8598-5-0"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <g
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)"
+         id="g3821-3-9">
+        <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 35.5,23.60911 35.5,59.5"
+           id="path8466-5-0-9"
+           inkscape:connector-curvature="0" />
+        <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 33.5,23.60911 33.5,59.5"
+           id="path8466-4-7-7-4"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g8678-6-1"
+       transform="matrix(1.0000032,0,0,0.99999991,-1e-6,45.40223)">
+      <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-9-7"
+         width="21.481806"
+         height="18.053268"
+         x="0.4999997"
+         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"
+         x="3.4977415"
+         y="807.20361"
+         id="text5217-8-32-6"
+         sodipodi:linespacing="125%"><tspan
+           y="807.20361"
+           x="3.4977415"
+           sodipodi:role="line"
+           id="tspan6156-8-5">21</tspan></text>
+    </g>
+    <rect
+       y="839.21106"
+       x="60.5"
+       height="18.053268"
+       width="21.481808"
+       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"
+       xml:space="preserve"><tspan
+         id="tspan6156-9-8-1"
+         sodipodi:role="line"
+         x="63.544647"
+         y="852.60547">22</tspan></text>
+    <g
+       id="g4295">
+      <rect
+         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"
+         id="rect2987-4-026-7-9"
+         width="21.481808"
+         height="18.053268"
+         x="120.50019"
+         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"
+         x="123.42475"
+         y="852.60547"
+         id="text5217-8-3-8-6"
+         sodipodi:linespacing="125%"><tspan
+           y="852.60547"
+           x="123.42475"
+           sodipodi:role="line"
+           id="tspan6156-0-9-3">23</tspan></text>
+    </g>
+    <path
+       inkscape:connection-start-point="d4"
+       inkscape:connection-start="#g8678-6-1"
+       inkscape:connector-curvature="0"
+       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" />
+    <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"
+       inkscape:connection-end="#g4295"
+       inkscape:connection-end-point="d4" />
+    <g
+       transform="translate(-60.000001,887.69517)"
+       id="g3118-2-6">
+      <rect
+         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"
+         id="rect2987-4-02-8-4"
+         width="21.481739"
+         height="18.05327"
+         x="120.5"
+         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"
+         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>
+    </g>
+    <path
+       inkscape:connection-end-point="d4"
+       inkscape:connection-end="#g3118-2-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-start="#g8678-6-1"
+       inkscape:connector-curvature="0"
+       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" />
+    <path
+       inkscape:connection-end-point="d4"
+       inkscape:connection-end="#g3118-2-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-start="#rect2987-4-02-6-9"
+       inkscape:connector-curvature="0"
+       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" />
+    <g
+       transform="translate(-1.0430814e-6,887.87361)"
+       id="g3118-2-6-6">
+      <rect
+         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"
+         id="rect2987-4-02-8-4-3"
+         width="21.481739"
+         height="18.05327"
+         x="120.5"
+         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"
+         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>
+    </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"
+       inkscape:connection-start="#g4295"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2-6-6"
+       inkscape:connection-end-point="d4" />
+    <path
+       inkscape:connector-curvature="0"
+       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"
+       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"
+       x="187.37656"
+       y="909.57391"
+       id="text4799-8-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="909.57391"
+         id="tspan4416">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="922.07391"
+         id="tspan4420">(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"
+       x="175.91385"
+       y="840.83063"
+       id="text4404"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan4406"
+         x="175.91385"
+         y="840.83063">obsolete,</tspan><tspan
+         sodipodi:role="line"
+         x="175.91385"
+         y="850.83063"
+         id="tspan4408">hidden,</tspan><tspan
+         sodipodi:role="line"
+         x="175.91385"
+         y="860.83063"
+         id="tspan4410">precursors</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"
+       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>
+    <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"
+       x="187.37656"
+       y="571.41107"
+       id="text4799-8-0-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="571.41107"
+         id="tspan4416-9">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="583.91107"
+         id="tspan4420-1">(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"
+       id="path4446"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <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,177.33443 c -11.66919,2.11797 -39.69025,-8.27526 -48.84561,0.8801 -4.08681,4.08681 5.91098,7.3857 -1.32015,11.00126 -8.45778,4.22889 -37.224994,-3.5204 -45.765254,-3.5204"
+       id="path4452"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <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 173.37991,274.14555 c -26.50591,-25.47484 -62.13868,-7.60786 -86.249903,3.5204"
+       id="path4458"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <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 172.05976,275.4657 c -15.34118,-5.10156 -27.83143,-16.04735 -35.64409,0.8801"
+       id="path4466"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <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 184.38118,349.39419 c -17.09613,-2.47468 -18.70357,-14.67863 -38.2844,-11.88137"
+       id="path4468"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <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 90.21036,370.95666 c 5.346579,-17.09267 25.584,-5.21534 35.20404,-18.04207"
+       id="path4690"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <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 87.570057,370.95666 C 90.583364,353.5751 71.256395,368.31133 69.968036,350.27429"
+       id="path4694"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <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 29.043336,106.04624 c 9.697316,11.54911 30.278008,-0.41536 36.084144,15.84182"
+       id="path4908"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <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 152.25749,104.72609 c -14.85295,-1.56817 -17.66404,5.2687 -18.48213,16.72192"
+       id="path5120"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+  </g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug11.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,659 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="250"
+   height="260"
+   id="svg8392"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug11.svg">
+  <defs
+     id="defs8394">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8414"
+       style="overflow:visible">
+      <path
+         id="path8416"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-7"
+       style="overflow:visible">
+      <path
+         id="path5316-7-1"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695"
+       style="overflow:visible">
+      <path
+         id="path8697"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695-6"
+       style="overflow:visible">
+      <path
+         id="path8697-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-5"
+       style="overflow:visible">
+      <path
+         id="path5316-7-0"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-2"
+       style="overflow:visible">
+      <path
+         id="path4193-0"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-1"
+       style="overflow:visible">
+      <path
+         id="path5316-7-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3338"
+       style="overflow:visible">
+      <path
+         id="path3340"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3342"
+       style="overflow:visible">
+      <path
+         id="path3344"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-3"
+       style="overflow:visible">
+      <path
+         id="path4193-8"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-8"
+       style="overflow:visible">
+      <path
+         id="path5316-7-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0-3"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0-5"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="131.9535"
+     inkscape:cy="63.06899"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="923"
+     inkscape:window-height="1064"
+     inkscape:window-x="75"
+     inkscape:window-y="87"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata8397">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-551.69805)">
+    <g
+       id="g8678"
+       transform="translate(0,-222)">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">25</tspan></text>
+    </g>
+    <g
+       id="g3118"
+       transform="translate(-60.000001,570.36218)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-9"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">26</tspan></text>
+    </g>
+    <g
+       id="g3126"
+       transform="translate(-60.000192,570.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-0"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">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"
+       d="m 21.981806,580.83549 38.518193,4e-5"
+       id="path3178"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3118"
+       inkscape:connection-end-point="d4"
+       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"
+       id="path3180"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3126"
+       inkscape:connection-end-point="d4" />
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,-8.2080488e-7,-108.66406)"
+       id="g8678-6">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-8"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">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"
+       id="rect2987-4-02-6"
+       width="21.481808"
+       height="18.053268"
+       x="60.5"
+       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"
+       x="63.544647"
+       y="698.53925"
+       id="text5217-8-72-1"
+       sodipodi:linespacing="125%"><tspan
+         y="698.53925"
+         x="63.544647"
+         sodipodi:role="line"
+         id="tspan6156-9-8">26</tspan></text>
+    <g
+       id="g3126-8"
+       transform="matrix(1.0000032,0,0,0.99999991,-60.000385,683.69805)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026-7"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">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"
+       d="m 21.981875,694.17135 38.518126,5e-5"
+       id="path3178-9"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       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"
+       d="m 81.981808,694.17141 38.518382,0"
+       id="path3180-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3126-8"
+       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="6.5114212"
+       y="652.66315"
+       id="text9295"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan9297"
+         x="6.5114212"
+         y="652.66315">obsolete</tspan><tspan
+         sodipodi:role="line"
+         x="6.5114212"
+         y="662.66315"
+         id="tspan9299">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"
+       x="159.24913"
+       y="668.43335"
+       id="text9301"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan9303"
+         x="159.24913"
+         y="668.43335">unstable</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"
+       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"
+   id="tspan3131">f1 f2 ...</tspan></tspan><tspan
+         sodipodi:role="line"
+         x="79.399506"
+         y="642.31293"
+         id="tspan3124">hg commit</tspan></text>
+    <g
+       id="g6372-4"
+       transform="translate(31.884309,581.4041)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8598-5"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <g
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)"
+         id="g3821-3">
+        <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 35.5,23.60911 35.5,59.5"
+           id="path8466-5-0"
+           inkscape:connector-curvature="0" />
+        <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 33.5,23.60911 33.5,59.5"
+           id="path8466-4-7-7"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g3118-2"
+       transform="translate(-60.000001,733.69805)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-8"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-3"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">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"
+       x="187.37656"
+       y="781.10907"
+       id="text3218"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="781.10907"
+         id="tspan4381">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="791.10907"
+         id="tspan3635">(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"
+       d="m 21.981875,703.12214 38.518124,32.09853"
+       id="path3178-9-5"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4"
+       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"
+       d="m 71.240897,703.1981 -2.2e-5,31.94668"
+       id="path4123"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#rect2987-4-02-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2"
+       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"
+       x="187.37656"
+       y="563.41107"
+       id="text4799-8-0-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="563.41107"
+         id="tspan4416-9">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="575.91107"
+         id="tspan4420-1">(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"
+       id="path4446"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g3118-2-4"
+       transform="translate(-1.0430813e-6,783.69805)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-8-7"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-3-0"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">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"
+       d="M 81.981738,753.12214 120.5,785.22069"
+       id="path3180-1-6"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118-2"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2-4"
+       inkscape:connection-end-point="d4" />
+    <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 30.44802,666.70515 c 9.697316,11.54911 30.278008,-0.41536 36.084144,15.84182"
+       id="path4908"
+       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-0);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 155.00217,664.33755 c -14.85295,-1.56817 -17.66404,5.2687 -18.48213,16.72192"
+       id="path5120"
+       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(#Arrow2Mend-2-0-5)"
+       d="m 184.5,777.49805 c -23.81983,-9.8642 -42.3145,-20.8823 -51.5,3"
+       id="path3662"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/figure-ug12.svg	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,606 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="270"
+   height="200"
+   id="svg3183"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug12.svg">
+  <defs
+     id="defs3185">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3206"
+       style="overflow:visible">
+      <path
+         id="path3208"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3210"
+       style="overflow:visible">
+      <path
+         id="path3212"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3214"
+       style="overflow:visible">
+      <path
+         id="path3216"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3218"
+       style="overflow:visible">
+      <path
+         id="path3220"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3226"
+       style="overflow:visible">
+      <path
+         id="path3228"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3234"
+       style="overflow:visible">
+      <path
+         id="path3236"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3238"
+       style="overflow:visible">
+      <path
+         id="path3240"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-1"
+       style="overflow:visible">
+      <path
+         id="path5316-7-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-8"
+       style="overflow:visible">
+      <path
+         id="path4193-8"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6080"
+       style="overflow:visible">
+      <path
+         id="path6082"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6084"
+       style="overflow:visible">
+      <path
+         id="path6086"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6088"
+       style="overflow:visible">
+      <path
+         id="path6090"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-3"
+       style="overflow:visible">
+      <path
+         id="path5316-7-2"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-5"
+       style="overflow:visible">
+      <path
+         id="path4193-3"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0-5"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="121.99883"
+     inkscape:cy="102.73738"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="825"
+     inkscape:window-height="678"
+     inkscape:window-x="413"
+     inkscape:window-y="279"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata3188">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-852.36218)">
+    <g
+       id="g4234"
+       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"
+         xml:space="preserve"><tspan
+           y="900.3703"
+           x="76.696045"
+           sodipodi:role="line"
+           id="tspan3322">hg evolve --all</tspan></text>
+      <g
+         transform="translate(29.180861,844.4619)"
+         id="g6372-4-2">
+        <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"
+           id="path8598-5-0"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g3821-3-9"
+           transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)">
+          <path
+             inkscape:connector-curvature="0"
+             id="path8466-5-0-9"
+             d="M 35.5,23.60911 35.5,59.5"
+             style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8466-4-7-7-4"
+             d="M 33.5,23.60911 33.5,59.5"
+             style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        </g>
+      </g>
+    </g>
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,-8.2250019e-7,130.00002)"
+       id="g8678-6">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-8"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">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"
+       id="rect2987-4-02-6"
+       width="21.481808"
+       height="18.053268"
+       x="60.5"
+       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"
+       x="63.544647"
+       y="937.20331"
+       id="text5217-8-72-1"
+       sodipodi:linespacing="125%"><tspan
+         y="937.20331"
+         x="63.544647"
+         sodipodi:role="line"
+         id="tspan6156-9-8">26</tspan></text>
+    <g
+       id="g4904">
+      <rect
+         y="923.80884"
+         x="120.50019"
+         height="18.053268"
+         width="21.481808"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9"
+           sodipodi:role="line"
+           x="123.42475"
+           y="937.20325">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"
+       d="m 21.981875,932.83543 38.518126,5e-5"
+       id="path3178-9"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       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"
+       d="m 81.981805,932.83549 38.518385,-1e-5"
+       id="path3180-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g4904"
+       inkscape:connection-end-point="d4" />
+    <g
+       id="g3118-2"
+       transform="translate(-60.000001,972.36213)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-8"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-3"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">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"
+       x="188.87656"
+       y="965.77319"
+       id="text3218"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         x="188.87656"
+         y="965.77319"
+         id="tspan4381">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="188.87656"
+         y="975.77319"
+         id="tspan3635">(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"
+       d="m 21.981875,941.78622 38.518124,32.09853"
+       id="path3178-9-5"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4"
+       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"
+       d="m 71.240897,941.86217 -2.2e-5,31.94669"
+       id="path4123"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#rect2987-4-02-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2"
+       inkscape:connection-end-point="d4" />
+    <g
+       id="g3118-2-4"
+       transform="translate(-8.2250019e-7,1022.3622)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-8-7"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-3-0"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">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"
+       d="M 81.981738,991.78623 120.5,1023.8848"
+       id="path3180-1-6"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118-2"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2-4"
+       inkscape:connection-end-point="d4" />
+    <g
+       id="g3126-8-4"
+       transform="matrix(1.000012,0,0,0.99999991,-60.002151,972.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026-7-1"
+         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"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9-7"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">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"
+       d="m 81.981738,982.8355 38.518272,4e-5"
+       id="path3180-1-4"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118-2"
+       inkscape:connection-start-point="d4"
+       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"
+       d="m 131.24108,941.86211 -5e-5,31.9468"
+       id="path4123-8"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g4904"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3126-8-4"
+       inkscape:connection-end-point="d4" />
+    <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 187.75,968.15572 c -23.81983,-9.8642 -42.3145,-20.8823 -51.5,3"
+       id="path3662"
+       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"
+       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
+         sodipodi:role="line"
+         x="175"
+         y="164.5"
+         id="tspan5019">(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"
+       id="path5021"
+       inkscape:connector-curvature="0"
+       transform="translate(0,852.36218)" />
+    <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 169,153 c -11.30259,8.89405 -8.87795,25.5 -24,25.5"
+       id="path5025"
+       inkscape:connector-curvature="0"
+       transform="translate(0,852.36218)" />
+  </g>
+</svg>
--- a/docs/index.rst	Fri Aug 08 15:50:26 2014 -0700
+++ b/docs/index.rst	Fri Aug 08 23:14:00 2014 -0700
@@ -1,166 +1,105 @@
-.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
-..                Logilab SA        <contact@logilab.fr>
-
-========================================
-Changeset Evolution Experimentation
-========================================
-
+.. Copyright © 2014 Greg Ward <greg@gerg.ca>
 
-This is the online documentation of the `evolve extension`_. An experimental
-extension that drive the implementation of the `changeset evolution concept`_ for
-Mercurial.
+==================================
+Changeset Evolution with Mercurial
+==================================
 
-.. _`evolve extension`: http://mercurial.selenic.com/wiki/EvolveExtension
-.. _`changeset evolution concept`: http://mercurial.selenic.com/wiki/ChangesetEvolution
+`evolve`_ is an experimental Mercurial extension for safe mutable history.
 
-Here are various materials on planned improvement to Mercurial regarding
-rewriting history.
+.. _`evolve`: http://mercurial.selenic.com/wiki/EvolveExtension
 
-First, read about what challenges arise while rewriting history and how we plan to
-solve them once and for all.
-
-.. toctree::
-   :maxdepth: 2
-
-   instability
-
-The effort is split in two parts:
+With core Mercurial, changesets are permanent and immutable. You can
+commit new changesets to modify your source code, but you cannot
+modify or remove old changesets—they are carved in stone for all
+eternity.
 
- * The **obsolescence marker** concept aims to provide an alternative to ``strip``
-   to get rid of changesets. This concept has been partially implemented since
-   Mercurial 2.3.
+For years, Mercurial has included various extensions that allow
+history modification: ``rebase``, ``mq``, ``histedit``, and so forth.
+These are useful and popular extensions, and in fact history
+modification is one of the big reasons DVCSes (distributed version
+control systems) like Mercurial took off.
 
- * The **evolve** Mercurial extension rewrites history using obsolete
-   *marker* under the hood.
-
-The first and most important step is by far the **obsolescence marker**. However
-most users will never be directly exposed to the concept. For this reason
-this manual starts with changeset evolution.
+But there's a catch: until now, Mercurial's various mechanisms for
+modifying history have been *unsafe*, in that changesets were
+destroyed (“stripped”) rather than simply made invisible.
 
-Evolve: A robust alternative to MQ
-====================================
-
-Evolve is an experimental history rewriting extension that uses obsolete
-markers. It is inspired by MQ and pbranch but has multiple advantages over
-them:
-
-* Focus on your current work.
+``evolve`` makes things better in a couple of ways:
 
-    You can focus your work on a single changeset and take care of adapting
-    descendent changesets later.
-
-* Handle **non-linear history with branches and merges**
+  * It changes the behaviour of most existing history modification
+    extensions (``rebase``, ``histedit``, etc.) so they use a safer
+    mechanism (*changeset obsolescence*, covered below) rather than
+    the older, less safe *strip* operation.
 
-* Rely internally on Mercurial's **robust merge** mechanism.
+  * It provides a new way of modifying history that is roughly
+    equivalent to ``mq`` (but much nicer and safer).
 
-  Simple conflicts are handled by real merge tools using the appropriate ancestor.
-  Conflicts are much rarer and much more user friendly.
+It helps to understand that ``evolve`` builds on infrastructure
+already in core Mercurial:
 
-*  Mutable history **fully available all the time**.
-
-  Always use 'hg update' and forget about (un)applying patches to access the
-  mutable part of your history.
-
-
-* Use only **plain changesets** and forget about patches. Evolve will create and
-  exchange real changesets. Mutable history can be used in all usual operations:
-  pull, push, log, diff, etc.
+  * *Phases* (starting in Mercurial 2.1) allow you to distinguish
+    mutable and immutable changesets. We'll cover phases early in the
+    user guide, since understanding phases is essential to
+    understanding ``evolve``.
 
-* Allow **sharing and collaboration** mutable history without fear of duplicates
-  (thanks to obsolete marker).
-
-* Cover all MQ usage but guard.
-
-.. warning:: The evolve extension and obsolete markers are at an experimental
-             stage. While using obsolete you willl likely be exposed to complex
-             implications of the **obsolete marker** concept. I do not recommend
-             non-power users to test this at this stage.
+  * *Changeset obsolescence* (starting in Mercurial 2.3) is how
+    Mercurial knows how history has been modified, specifically when
+    one changeset replaces another. In the obsolescence model, a
+    changeset is neither removed nor modified, but is instead marked
+    *obsolete* and typically replaced by a *successor*. Obsolete
+    changesets usually become *hidden* as well. Obsolescence is an
+    invisible feature until you start using ``evolve``, so we'll cover
+    it in the user guide too.
 
-             While numbered 1.0.0, the command line API of this version should
-             **not** be regarded as *stable*: command behavior, name and
-             options may change in future releases or once integrated into
-             Mercurial. It is still an immature extension; a lot of
-             features are still missing but there is low risk of
-             repository corruption.
-
-             Production-ready version should hide such details from normal users.
+Some of the things you can do with ``evolve`` are:
 
-The evolve extension requires Mercurial 2.5 (older versions supports down to 2.2)
-
-To enable the evolve extension use::
-
-    $ hg clone https://bitbucket.org/marmoute/mutable-history -u stable
-    $ echo '[extensions]\nevolve=$PWD/mutable-history/hgext/evolve.py' >> ~/.hgrc
-
-You will probably want to use hgview_ to visualize obsolescence. Version 1.7.1
-or later is required.
-
-.. _hgview: http://www.logilab.org/project/hgview/
+  * Fix a mistake immediately: “Oops! I just committed a changeset
+    with a syntax error—I'll fix that and amend the changeset so no
+    one sees my mistake.” (While this is possible using existing
+    features of core Mercurial, ``evolve`` makes it safer.)
 
-
- ---
-
-For more information see the documents below:
-
-.. toctree::
-   :maxdepth: 1
+  * Fix a mistake a little bit later: “Oops! I broke the tests three
+    commits back, but only noticed it now—I'll just update back to the
+    bad changeset, fix my mistake, amend the changeset, and evolve
+    history to update the affected changesets.”
 
-   tutorials/tutorial
-   evolve-good-practice
-   evolve-faq
-   from-mq
-   evolve-collaboration
-   qsync
+  * Remove unwanted changes: “I hacked in some debug output two
+    commits back; everything is working now, so I'll just prune that
+    unwanted changeset and evolve history before pushing.”
 
-Smart changeset deletion: Obsolete Marker
-==========================================
-
-The obsolete marker is a powerful concept that allows Mercurial to safely handle
-history rewriting operations. It is a new type of relation between Mercurial
-changesets that tracks the result of history rewriting operations.
+  * Share mutable history with yourself: say you do most of your
+    programming work locally, but need to test on a big remote server
+    somewhere before you know everything is good. You can use
+    ``evolve`` to share mutable history between two computers, pushing
+    finely polished changesets to a public repository only after
+    testing on the test server.
 
-This concept is simple to define and provides a very solid base for:
-
-- very fast history rewriting operations
-
-- auditable and reversible history rewriting process
-
-- clean final history
-
-- share and collaborate on mutable parts of the history
+  * Share mutable history for code review: you don't want to publish
+    unreviewed changesets, but you can't block every commit waiting
+    for code review. The solution is to share mutable history with
+    your reviewer, amending each changeset until it passes review.
 
-- gracefully handle history rewriting conflicts
-
-- allow various history rewriting UI to collaborate with a underlying common API
+``evolve`` is experimental!
+---------------------------
 
- ---
+TODO
 
-For more information, see the documents below
-
-.. toctree::
-   :maxdepth: 1
+  * unstable UI
+  * some corner cases not covered yet
 
-   obs-concept
-   obs-terms
-   obs-implementation
-
+Installation and setup
+----------------------
 
-Known limitations and bugs
-=================================
-
-Here is a list of known issues that will be fixed later:
-
+TODO
 
-* You need to provide to `graft --continue -O` if you started you
-  graft using `-O`.
-
-  you to manually specify target all the time.
-
-* Trying to exchange obsolete marker with a static http repo will crash.
+Next steps:
+  * For a practical guide to using ``evolve`` in a single repository,
+    see the `user guide`_.
+  * For more advanced tricks, see `sharing mutable history`_.
+  * To learn about the concepts underlying ``evolve``, see `concepts`_
+    (incomplete).
+  * If you're coming from MQ, see the `MQ migration guide`_ (incomplete).
 
-* Extinct changesets are hidden using the *hidden* feature of mercurial only
-  supported by a few commands.
-
-  Only ``hg log``, ``hgview`` and `hg glog` support it. Neither ``hg heads`` nor other visual viewers do.
-
-* hg heads shows extinct changesets.
+.. _`user guide`: user-guide.html
+.. _`concepts`: concepts.html
+.. _`sharing mutable history`: sharing.html
+.. _`MQ migration guide`: from-mq.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/sharing.rst	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,461 @@
+.. Copyright © 2014 Greg Ward <greg@gerg.ca>
+
+------------------------------
+Evolve: Shared Mutable History
+------------------------------
+
+Once you have mastered the art of mutable history in a single
+repository, you might want to move up to the next level: *shared*
+mutable history. ``evolve`` lets you push and pull draft changesets
+between repositories along with their obsolescence markers. This opens
+up a number of interesting possibilities.
+
+The most common scenario is a single developer working across two
+computers. Say you're working on code that must be tested on a remote
+test server, probably in a rack somewhere, only accessible by SSH, and
+running an “enterprise-grade” (out-of-date) OS. But you probably
+prefer to write code locally: everything is setup the way you like it,
+and you can use your preferred editor, IDE, merge/diff tools, etc.
+
+Traditionally, your options are limited: either
+
+  * (ab)use your source control system by committing half-working code
+    in order to get it onto the remote test server, or
+  * go behind source control's back by using ``rsync`` (or similar) to
+    transfer your code back-and-forth until it is ready to commit
+
+The former is less bad with distributed version control systems like
+Mercurial, but it's still far from ideal. (One important version
+control “best practice” is that every commit should make things just a
+little bit better, i.e. you should never commit code that is worse
+than what came before.) The latter, avoiding version control entirely,
+means that you're walking a tightrope without a safety net. One
+accidental ``rsync`` in the wrong direction could destroy hours of
+work.
+
+Using Mercurial with ``evolve`` to share mutable history solves all of
+these problems. As with single-repository ``evolve``, you can commit
+whenever the code is demonstrably better, even if all the tests aren't
+passing yet—just ``hg amend`` when they are. And you can transfer
+those half-baked changesets between repositories to try things out on
+your test server before anything is carved in stone.
+
+A less common scenario is multiple developers sharing mutable history.
+(This is in fact how Mercurial itself is developed.) We'll cover this
+scenario later. But first, single-user sharing.
+
+Publishing and non-publishing repositories
+------------------------------------------
+
+The key to shared mutable history is to keep your changesets in
+*draft* phase as you pass them around. Recall that by default, ``hg
+push`` promotes changesets from *draft* to *public*, and public
+changesets are immutable. You can change this behaviour by
+reconfiguring the *target* repository so that it is non-publishing.
+(Short version: set ``phases.publish`` to ``false``. Long version
+follows.)
+
+Setting things up
+-----------------
+
+We'll work an example with three local repositories, although in the
+real world they'd most likely be on three different computers. First,
+the public repository is where tested, polished changesets live, and
+it is where you push/pull changesets to/from the rest of your team. ::
+
+  $ hg init public
+
+We'll need two clones where work gets done::
+
+  $ hg clone -q public test-repo
+  $ hg clone -q test-repo dev-repo
+
+``dev-repo`` is your local machine, with GUI merge tools and IDEs and
+everything configured just the way you like it. ``test-repo`` is the
+test server in a rack somewhere behind SSH. So for the most part,
+we'll develop in ``dev-repo``, push to ``test-repo``, test and polish
+there, and push to ``public``.
+
+The key to making this whole thing work is to make ``test-repo``
+non-publishing::
+
+  $ cat >> test-repo/.hg/hgrc <<EOF
+  [phases]
+  publish = false
+  EOF
+
+We also have to configure ``evolve`` in both ``test-repo`` and
+``dev-repo``, so that we can amend and evolve in both of them. ::
+
+  $ cat >> test-repo/.hg/hgrc <<EOF
+  [extensions]
+  rebase =
+  evolve = /path/to/mutable-history/hgext/evolve.py
+  EOF
+  $ cat >> dev-repo/.hg/hgrc <<EOF
+  [extensions]
+  rebase =
+  evolve = /path/to/mutable-history/hgext/evolve.py
+  EOF
+
+Keep in mind that in real life, these repositories would probably be
+on separate computers, so you'd have to login to each one to configure
+each repository.
+
+To start things off, let's make one public, immutable changeset::
+
+  $ cd test-repo
+  $ echo 'my new project' > file1
+  $ hg add file1
+  $ hg commit -m 'create new project'
+  $ hg push -q
+
+and pull that into the development repository::
+
+  $ cd ../dev-repo
+  $ hg pull -u
+
+Amending a shared changeset
+---------------------------
+
+Everything you learned in the `user guide`_ applies to work done in
+``dev-repo``. You can commit, amend, uncommit, evolve, and so forth
+just as before.
+
+.. _`user guide`: user-guide.html
+
+Things get different when you push changesets to ``test-repo``. Or
+rather, things stay the same, which *is* different: because we
+configured ``test-repo`` to be non-publishing, draft changesets stay
+draft when we push them to ``test-repo``. Importantly, they're also
+draft (mutable) in ``test-repo``.
+
+Let's commit a preliminary change and push it to ``test-repo`` for
+testing. ::
+
+  $ echo 'fix fix fix' > file1
+  $ hg commit -m 'prelim change'
+  $ hg push ../test-repo
+
+At this point, ``dev-repo`` and ``test-repo`` have the same changesets
+in the same phases:
+
+  [figure SG01: rev 0:0dc9 public, rev 1:f649 draft, same on both repos]
+
+(You may notice a change in notation from the user guide: now
+changesets are labelled with their revision number and the first four
+digits of the 40-digit hexadecimal changeset ID. Mercurial revision
+numbers are never stable when working across repositories, especially
+when obsolescence is involved. We'll see why shortly.)
+
+Now let's switch to ``test-repo`` to test our change::
+
+  $ cd ../test-repo
+  $ hg update
+
+Don't forget to ``hg update``! Pushing only adds changesets to a
+remote repository; it does not update the working directory (unless
+you have a hook that updates for you).
+
+Now let's imagine the tests failed because we didn't use proper
+punctuation and capitalization (oops). Let's amend our preliminary fix
+(and fix the lame commit message while we're at it)::
+
+  $ echo 'Fix fix fix.' > file1
+  $ hg amend -m 'fix bug 37'
+
+Now we're in a funny intermediate state (figure 2): revision 1:f649 is
+obsolete in ``test-repo``, having been replaced by revision 3:60ff
+(revision 2:2a03 is another one of those temporary amend commits that
+we saw in the user guide)—but ``dev-repo`` knows nothing of these
+recent developments.
+
+  [figure SG02: rev 0:0dc9 public, rev 1:f649, 2:2a03 obsolete, rev 3:60ff draft -- but dev-repo same as in SG01]
+
+Let's resynchronize::
+
+  $ cd ../dev-repo
+  $ hg pull -u
+
+As seen in figure 3, this transfers the new changeset *and* the
+obsolescence marker for revision 1. However, it does *not* transfer
+the temporary amend commit, because it is obsolete. Push and pull
+transfer obsolesence markers between repositories, but they do not
+normally transfer obsolete changesets.
+
+  [figure SG03: dev-repo grows new rev 2:60ff, marks 1:f649 obsolete]
+
+Because of this deliberately incomplete synchronization, revision
+numbers in ``test-repo`` and ``dev-repo`` are no longer consistent. We
+*must* use changeset IDs.
+
+Amend again, locally
+--------------------
+
+This process can repeat. Perhaps you figure out a more elegant fix to
+the bug, and want to mutate history so nobody ever knows you had a
+less-than-perfect idea. We'll implement it locally in ``dev-repo`` and
+push to ``test-repo``::
+
+  $ echo 'Fix, fix, and fix.' > file1
+  $ hg amend
+  $ hg push
+
+This time around, the temporary amend commit is in ``dev-repo``, and
+it is not transferred to ``test-repo``—the same as before, just in the
+opposite direction. Figure 4 shows the two repositories after amending
+in ``dev-repo`` and pushing to ``test-repo``.
+
+  [figure SG04: each repo has one temporary amend commit, but they're different in each one]
+
+Let's hop over to ``test-repo`` to test the more elegant fix::
+
+  $ cd ../test-repo
+  $ hg update -q
+
+This time, all the tests pass, so no further amendment is required.
+This bug fix is finished, so we push it to the public repository::
+
+  $ hg push
+  [...]
+  added 1 changesets with 1 changes to 1 files
+
+Note that only one changeset—the final version, after two
+amendments—was actually pushed. Again, Mercurial normally doesn't
+transfer obsolete changesets on push and pull. (Specifically, it
+doesn't transfer *hidden* changesets: roughly speaking, obsolete
+changesets with no non-obsolete descendants. If you're curious, see
+the `concept guide`_ for the precise definition of hidden.)
+
+.. _`concept guide`: concepts.html
+
+So the picture in ``public`` is much simpler than in either
+``dev-repo`` or ``test-repo``. None of our missteps or amendments are
+visible publicly, just the final, beautifully polished changeset:
+
+  [figure SG05: public repo with rev 0:0dc9, 1:de61, both public]
+
+There is one important step left to do. Because we pushed from
+``test-repo`` to ``public``, the pushed changeset is in *public* phase
+in those two repositories. But ``dev-repo`` knows nothing of this:
+that changeset is still *draft* there. If we're not careful, we might
+mutate history in ``dev-repo``, obsoleting a changeset that is already
+public. Let's avoid that situation for now by pulling from
+``test-repo`` down to ``dev-repo``::
+
+  $ cd ../dev-repo
+  $ hg pull -u
+
+Getting into trouble
+--------------------
+
+Mercurial with ``evolve`` is a powerful tool, and using powerful tools
+can have consequences. (You can cut yourself badly with a sharp knife,
+but every competent chef keeps several around. Ever try to chop onions
+with a spoon?)
+
+In the user guide, we saw examples of *unstable* changesets, which are
+the most common type of troubled changeset. (Recall that a
+non-obsolete changeset with obsolete ancestors is unstable.)
+
+Two other types of trouble can crop up: *bumped* and *divergent*
+changesets. Both are more likely with shared mutable history,
+especially mutable history shared by multiple developers.
+
+To demonstrate, let's start with the ``public`` repository as we left
+it in the last example, with two immutable changesets (figure 5
+above). Two developers, Alice and Bob, start working from this point::
+
+  $ hg clone -q public alice
+  $ hg clone -q public bob
+
+We need to configure Alice's and Bob's working repositories similar to
+``test-repo``, i.e. make them non-publishing and enable ``evolve``::
+
+  $ cat >> alice/.hg/hgrc <<EOF
+  [phases]
+  publish = false
+  [extensions]
+  rebase =
+  evolve = /path/to/mutable-history/hgext/evolve.py
+  EOF
+  $ cp alice/.hg/hgrc bob/.hg/hgrc
+
+Bumped changesets: only one gets on the plane
+---------------------------------------------
+
+If two people show up at the airport with tickets for the same seat on
+the same plane, only one of them gets on the plane. The would-be
+traveller left behind in the airport terminal is said to have been
+*bumped*.
+
+Similarly, if Alice and Bob are collaborating on some mutable
+changesets, it's possible to get into a situation where an otherwise
+worthwhile changeset cannot be pushed to the public repository; it is
+bumped by an alternative changeset that happened to get there first.
+Let's demonstrate one way this could happen.
+
+It starts with Alice committing a bug fix. Right now, we don't yet
+know if this bug fix is good enough to push to the public repository,
+but it's good enough for Alice to commit. ::
+
+  $ cd alice
+  $ echo 'fix' > file2
+  $ hg commit -q -A -m 'fix bug 15'
+
+Now Bob has a bad idea: he decides to pull whatever Alice is working
+on and tweak her bug fix to his taste::
+
+  $ cd ../bob
+  $ hg pull -q -u ../alice
+  $ echo 'Fix.' > file2
+  $ hg amend -q -A -m 'fix bug 15 (amended)'
+
+(Note the lack of communication between Alice and Bob. Failing to
+communicate with your colleagues is a good way to get into trouble.
+Nevertheless, ``evolve`` can usually sort things out, as we will see.)
+
+  [figure SG06: Bob's repo with one amendment]
+
+After some testing, Alice realizes her bug fix is just fine as it is:
+no need for further polishing and amending, this changeset is ready to
+publish. ::
+
+  $ cd ../alice
+  $ hg push  -q
+
+This introduces a contradiction: in Bob's repository, changeset 2:e011
+(his copy of Alice's fix) is obsolete, since Bob amended it. But in
+Alice's repository (and ``public``), that changeset is public: it is
+immutable, carved in stone for all eternity. No changeset can be both
+obsolete and public, so Bob is in for a surprise the next time he
+pulls from ``public``::
+
+  $ cd ../bob
+  $ hg pull -q -u
+  1 new bumped changesets
+
+Figure 7 shows what just happened to Bob's repository: changeset
+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 in trouble:
+it has been *bumped*.
+
+  [figure SG07: 2:e011 now public not obsolete, 4:fe88 now bumped]
+
+As usual when there's trouble in your repository, the solution is to
+evolve it::
+
+  $ hg evolve --all
+
+Figure 8 illustrate's Bob's repository after evolving away the bumped
+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``.
+
+  [figure SG08: 5:227d is new, formerly bumped changeset 4:fe88 now hidden]
+
+Divergent changesets
+--------------------
+
+In addition to *unstable* and *bumped*, there is a third kind of
+troubled changeset: *divergent*. When an obsolete changeset has two
+successors, those successors are divergent.
+
+To illustrate, let's start Alice and Bob at the same
+point—specifically, the point where Alice's repository currently
+stands. Bob's repository is a bit of a mess, so we'll throw it away
+and start him off with a copy of Alice's repository::
+
+  $ cd ..
+  $ rm -rf bob
+  $ cp -rp alice bob
+
+Now we'll have Bob commit a bug fix that could still be improved::
+
+  $ cd bob
+  $ echo 'pretty good fix' >> file1
+  $ hg commit -u bob -m 'fix bug 24 (v1)'
+
+This time, Alice meddles with her colleague's work (still a bad
+idea)::
+
+  $ cd ../alice
+  $ hg pull -q -u ../bob
+  $ echo 'better (alice)' >> file1
+  $ hg amend -u alice -m 'fix bug 24 (v2 by alice)'
+
+Here's where things change from the "bumped" scenario above: this
+time, the original author (Bob) decides to amend his changeset too. ::
+
+  $ cd ../bob
+  $ echo 'better (bob)' >> file1
+  $ hg amend -u bob -m 'fix bug 24 (v2 by bob)'
+
+At this point, the divergence exists, but only in theory: Bob's
+original changeset, 3:fe81, is obsolete and has two successors. But
+those successors are in different repositories, so the trouble is not
+visible to anyone yet. It will be as soon as one of our players pulls
+from the other's repository. Let's make Bob the victim again::
+
+  $ hg pull -q -u ../alice
+  not updating: not a linear update
+  (merge or update --check to force update)
+  2 new divergent changesets
+
+The “not a linear update” is our first hint that something is wrong,
+but of course “2 new divergent changesets” is the real problem. Figure
+9 shows both problems.
+
+  [figure SG09: bob's repo with 2 heads for the 2 divergent changesets, 5:fc16 and 6:694f; wc is at 5:fc16, hence update refused; both are successors of obsolete 3:fe81, hence divergence]
+
+Now we need to get out of trouble. Unfortunately, a `bug`_ in
+``evolve`` means that the usual answer (run ``hg evolve --all``) does
+not work. Bob has to figure out the solution on his own: in this case,
+merge. To avoid distractions, we'll set ``HGMERGE`` to make Mercurial
+resolve any conflicts in favour of Bob. ::
+
+  $ HGMERGE=internal:local hg merge
+  $ hg commit -m merge
+
+.. _`bug`: https://bitbucket.org/marmoute/mutable-history/issue/48/
+
+This is approximately what ``hg evolve`` would do in this
+circumstance, if not for that bug. One annoying difference is that
+Mercurial thinks the two divergent changesets are still divergent,
+which you can see with a simple revset query::
+
+  $ hg log -q -r 'divergent()'
+  5:fc16901f4d7a
+  6:694fd0f6b503
+
+(That annoyance should go away when the bug is fixed.)
+
+Conclusion
+----------
+
+Mutable history is a powerful tool. Like a sharp knife, an experienced
+user can do wonderful things with it, much more wonderful than with a
+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”
+changesets. But having a first-aid kit nearby does not excuse you from
+being careful with sharp knives.
+
+Mutable history shared across multiple repositories by a single
+developer is a natural extension of this model. Once you are used to
+using a single sharp knife on its own, it's pretty straightforward to
+chop onions and mushrooms using the same knife, or to alternate
+between two chopping boards with different knives.
+
+Mutable history shared by multiple developers is a scary place to go.
+Imagine a professional kitchen full of expert chefs tossing their
+favourite knives back and forth, with the occasional axe or chainsaw
+thrown in to spice things up. If you're confident that you *and your
+colleagues* can do it without losing a limb, go for it. But be sure to
+practice a lot first before you rely on it!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/user-guide.rst	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,561 @@
+.. Copyright © 2014 Greg Ward <greg@gerg.ca>
+
+------------------
+Evolve: User Guide
+------------------
+
+.. contents::
+
+Life without ``evolve``
+-----------------------
+
+Before we dive into learning about ``evolve``, let's look into some
+features of core Mercurial that interact with ``evolve``. ``commit``
+affects ``evolve``, and ``evolve`` modifies how ``commit --amend``
+works.
+
+Example 1: Commit a new changeset
+=================================
+
+To create a new changeset, simply run ``hg commit`` as usual.
+``evolve`` does not change the behaviour of ``commit`` at all.
+
+However, it's important to understand that new changesets are in the
+*draft* phase by default: they are mutable. This means that they can
+be modified by Mercurial's existing history-editing commands
+(``rebase``, ``histedit``, etc.), and also by the ``evolve``
+extension. Specifically, ``evolve`` adds a number of commands that can
+be used to modify history: ``amend``, ``uncommit``, ``prune``,
+``fold``, and ``evolve``. Generally speaking, changesets remain in
+*draft* phase until they are pushed to another repository, at which
+point they enter *public* phase. ::
+
+  $ hg commit -m 'implement feature X'
+  $ hg phase -r .
+  1: draft
+
+(Strictly speaking, changesets only become public when they are pushed
+to a *publishing* repository. But all repositories are publishing by
+default; you have to explicitly configure repositories to be
+*non-publishing*. Non-publishing repositories are an advanced topic
+which we'll see when we get to `sharing mutable history`_.)
+
+.. _`sharing mutable history`: sharing.html
+
+Example 2: Amend a changeset (traditional)
+==========================================
+
+Imagine you've just committed a new changeset, and then you discover a
+mistake. Maybe you forgot to run the tests and a failure slipped in.
+You want to modify history so that you push one perfect changeset,
+rather than one flawed changeset followed by an "oops" commit. (Or
+perhaps you made a typo in the commit message—this is really feature
+*Y*, not feature X. You can't fix that with a followup commit.)
+
+This is actually trivial with plain vanilla Mercurial since 2.2: fix
+your mistake and run ::
+
+  $ hg commit --amend -m 'implement feature Y'
+
+to create a new, amended changeset. The drawback of doing this with
+vanilla Mercurial is that your original, flawed, changeset is removed
+from the repository. This is *unsafe* history editing. It's probably
+not too serious if all you did was fix a syntax error, but still.
+
+.. figure:: figures/figure-ug01.svg
+
+   Figure 1: unsafe history modification with core Mercurial (not
+   using ``evolve``): the original revision 1 is destroyed.
+
+(Incidentally, Mercurial's traditional history modification mechanism
+isn't *really* unsafe: any changeset(s) removed from the repository
+are kept in a backup directory, so you can manually restore them later
+if you change your mind. But it's awkward and inconvenient compared to
+the features provided by ``evolve`` and changeset obsolescence.)
+
+Life with ``evolve`` (basic usage)
+----------------------------------
+
+Once you enable the ``evolve`` extension, a number of features are
+available to you. First, we're going to explore several examples of
+painless, trouble-free history modification.
+
+Example 3: Amend a changeset (with ``evolve``)
+==============================================
+
+Outwardly, amending a changeset with ``evolve`` can look exactly the
+same as it does with core Mercurial (example 2)::
+
+  $ hg commit --amend -m 'implement feature Y'
+
+Alternately, you can use the new ``amend`` command added by
+``evolve``::
+
+  $ hg amend -m 'implement feature Y'
+
+(``hg amend`` is nearly synonymous with ``hg commit --amend``. The
+difference is that ``hg amend`` reuses the existing commit message by
+default, whereas ``hg commit --amend`` runs your editor if you don't
+pass ``-m`` or ``-l``.)
+
+Under the hood, though, things are quite different. Mercurial has
+simply marked the old changeset *obsolete*, replacing it with a new
+one. We'll explore what this means in detail later, after working
+through a few more examples.
+
+Example 4: Prune an unwanted changeset
+======================================
+
+Sometimes you make a change, and then decide it was such a bad idea
+that you don't want anyone to know about it. Or maybe it was a
+debugging hack that you needed to keep around for a while, but do not
+intend to ever push publicly. ::
+
+  $ echo 'debug hack' >> file1.c
+  $ hg commit -m 'debug hack'
+
+In either case, ``hg prune`` is the answer. ``prune`` simply marks
+changesets obsolete without creating any new changesets to replace
+them::
+
+  $ hg prune .
+  1 changesets pruned
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory now at 934359450037
+
+Outwardly, it appears that your “debug hack” commit never happened;
+we're right back where we started::
+
+  $ hg parents --template '{rev}:{node|short}  {desc|firstline}\n'
+  3:934359450037  implement feature Y
+
+In reality, though, the “debug hack” is still there, obsolete and hidden.
+
+Example 5: Uncommit changes to certain files
+============================================
+
+Occasionally you commit more than you intended: perhaps you made
+unrelated changes to different files, and thus intend to commit
+different files separately. ::
+
+  $ echo 'relevant' >> file1.c
+  $ echo 'irrelevant' >> file2.c
+
+If you forget to specify filenames on the ``commit`` command line,
+Mercurial commits all those changes together::
+
+  $ hg commit -m 'fix bug 234'          # oops: too many files
+
+Luckily, this mistake is easy to fix with ``uncommit``::
+
+  $ hg uncommit file2.c
+  $ hg status
+  M file2.c
+
+Let's verify that the replacement changeset looks right (i.e.,
+modifies only ``file1.c``)::
+
+  $ hg parents --template '{rev}:{node|short}  {desc|firstline}\n{files}\n'
+  6:c8defeecf7a4  fix bug 234
+  file1.c
+
+As before, the original flawed changeset is still there, but obsolete
+and hidden. It won't be exchanged with other repositories by ``push``,
+``pull``, or ``clone``.
+
+Example 6: Fold multiple changesets together into one
+=====================================================
+
+If you're making extensive changes to fragile source code, you might
+commit more frequently than normal so that you can fallback on a
+known good state if one step goes badly. ::
+
+  $ echo step1 >> file1.c
+  $ hg commit -m 'step 1'               # revision 7
+  $ echo step2 >> file1.c
+  $ hg commit -m 'step 2'               # revision 8
+  $ echo step3 >> file2.c
+  $ hg commit -m 'step 3'               # revision 9
+
+At the end of such a sequence, you often end up with a series of small
+changesets that are tedious to review individually. It might make more
+sense to combine them into a single changeset using the ``fold``
+command.
+
+To make sure we pass the right revisions to ``fold``, let's review the
+changesets we just created, from revision 7::
+
+  $ hg log --template '{rev}:{node|short}  {desc|firstline}\n' -r 7::
+  7:05e61aab8294  step 1
+  8:be6d5bc8e4cc  step 2
+  9:35f432d9f7c1  step 3
+
+and fold them::
+
+  $ hg fold -m 'fix bug 64' -r 7::
+  3 changesets folded
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+This time, Mercurial marks three changesets obsolete, replacing them
+all with a single *successor*.
+
+(You might be familiar with this operation under other names, like
+*squash* or *collapse*.)
+
+Changeset obsolescence under the hood
+-------------------------------------
+
+So far, everything has gone just fine. We haven't run into merge
+conflicts or other trouble. Before we start exploring advanced usage
+that can run into trouble, let's step back and see what happens when
+Mercurial marks changesets obsolete. That will make it much easier to
+understand the more advanced use cases we'll see later.
+
+When you have the ``evolve`` extension enabled, all history
+modification uses the same underlying mechanism: the original
+changesets are marked *obsolete* and replaced by zero or more
+*successors*. The obsolete changesets are the *precursors* of their
+successors. This applies equally to built-in commands (``commit
+--amend``), commands added by ``evolve`` (``amend``, ``prune``,
+``uncommit``, ``fold``), and even commands provided by other
+extensions (``rebase``, ``histedit``).
+
+Another way of looking at it is that obsolescence is second-order
+version control, i.e. the history of your history. We'll cover this in
+more detail (and mathematical precision) in the `concepts`_ guide.
+
+.. _`concepts`: concepts.html
+
+Under the hood: Amend a changeset
+=================================
+
+Consider Example 2, amending a changeset with ``evolve``. We saw above
+that you can do this using the exact same command-line syntax as core
+Mercurial, namely ``hg commit --amend``. But the implementation is
+quite different, and Figure 2 shows how.
+
+.. 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.)
+
+In this case, the obsolete changesets are also *hidden*. That is the
+usual end state for obsolete changesets. But many scenarios result in
+obsolete changesets that are still visible, which indicates your
+history modification work is not yet done. We'll see examples of that
+later, when we cover advanced usage.
+
+Seeing hidden changesets
+========================
+
+TODO
+
+Under the hood: Prune an unwanted changeset
+===========================================
+
+``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
+involved. (If the working directory parent was one of the obsolete
+changesets, ``prune`` updates back to a suitable ancestor.)
+
+.. figure:: figures/figure-ug03.svg
+
+   Figure 3: pruning a changeset marks it obsolete with no successors.
+
+Under the hood: Uncommit changes to certain files
+=================================================
+
+In one sense, ``uncommit`` is a simplified version of ``amend``. Like
+``amend``, it obsoletes one changeset and leaves it with a single
+successor. Unlike ``amend``, there is no ugly "temporary amend commit"
+cluttering up the repository.
+
+In another sense, ``uncommit`` is the inverse of ``amend``: ``amend``
+takes any uncommitted changes in the working dir and “adds”
+them to the working directory's parent changeset. (In reality, of
+course, it creates a successor changeset, marking the original
+obsolete.) In contrast, ``uncommit`` takes some changes in the working
+directory's parent and moves them to the working dir, creating a new
+successor changeset in the process. Figure 4 illustrates.
+
+.. figure:: figures/figure-ug04.svg
+
+   Figure 4: uncommit moves some of the changes from the working
+   directory parent into the working dir, preserving the remaining
+   changes as a new successor changeset. (N.B. revision 4 is not shown
+   here because it was marked obsolete in the previous example.)
+
+
+Under the hood: Fold multiple changesets together into one
+==========================================================
+
+The last basic example is folding multiple changesets into one, which
+marks multiple changesets obsolete, replacing them all with a single
+successor.
+
+.. figure:: figures/figure-ug05.svg
+
+   Figure 5: fold combines multiple changesets into a single
+   successor, marking the original (folded) changesets obsolete.
+
+
+Obsolete is not hidden
+======================
+
+TODO
+
+
+Understanding revision numbers
+==============================
+
+If you're trying these examples on your own, especially using ``hg
+log`` without ``--hidden``, you have probably noticed some funny
+business going on with revision numbers: there are now gaps in the
+sequence. 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 95 is followed by revision 98, that means there are two
+hidden changesets, 96 and 97, in between.
+
+Note that changeset IDs are still the permanent, immutable identifier
+for changesets. Revision numbers are, as ever, a handy shorthand that
+work in your local repository, but cannot be used across repositories.
+They also have the useful property of showing when there are hidden
+changesets lurking under the covers, which is why this document uses
+revision numbers.
+
+
+Life with ``evolve`` (advanced usage)
+-------------------------------------
+
+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,
+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
+a consistent way for you to get out of trouble.
+
+(Incidentally, there are two other types of trouble that changesets
+can get into with ``evolve``: they may be *divergent* or *bumped*.
+Both of those states are more likely to occur when `sharing mutable
+history`_, so we won't see them in this user guide.)
+
+.. _`sharing mutable history`: sharing.html
+
+
+Example 7: Amend an older changeset
+===================================
+
+Sometimes you don't notice your mistakes until after you have
+committed some new changesets on top of them. ::
+
+  $ hg commit -m 'fix bug 17'         # rev 11 (mistake here)
+  $ hg commit -m 'cleanup'            # rev 12
+  $ hg commit -m 'feature 23'         # rev 13
+
+Traditionally, your only option is to commit an "oops" changeset that
+fixes your mistake. That works, of course, but it makes you look bad:
+you made a mistake, and the record of that mistake is recorded in
+history for all eternity. (If the mistake was in the commit message,
+too bad.)
+
+More subtly, there now exist changesets that are *worse* than what
+came before—the code no longer builds, the tests don't pass, or
+similar. Anyone reviewing these patches will waste time noticing the
+error in the earlier patch, and then the correction later on.
+
+You can avoid all this by amending the bad changeset and *evolving*
+subsequent history. Here's how it works, assuming you have just
+committed revision 13 and noticed the mistake in revision 11::
+
+  $ hg update 11
+  [...fix mistake...]
+  $ 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*.
+
+.. 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.
+
+All non-obsolete descendants of an obsolete changeset are unstable. 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.
+
+The fix is to *evolve* history::
+
+  $ hg evolve --all
+
+This is a separate step, not automatically part of ``hg amend``,
+because there might be conflicts. If your amended changeset modifies a
+file that one of its descendants also modified, Mercurial has to fire
+up your merge tool to resolve the conflict. More importantly, you have
+to switch contexts from "writing code" to "resolving conflicts". That
+can be an expensive context switch, so Mercurial lets you decide when
+to do it.
+
+The end state, after ``evolve`` finishes, is that the original
+revisions (11-13) are obsolete and hidden. Their successor revisions
+(15-17) 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
+   replaced by successors just like the amended changeset was.
+
+Example 8: Prune an older changeset
+===================================
+
+Let's say you've just committed the following changesets::
+
+  $ hg commit -m 'useful work'       # rev 18
+  $ hg commit -m 'debug hack'        # rev 19
+  $ hg commit -m 'more work'         # rev 20
+
+You want to drop revision 19, but keep 18 and 20. No problem::
+
+  $ hg prune 19
+  1 changesets pruned
+  1 new unstable 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.
+
+.. 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.
+
+As before, the solution to unstable changesets is to evolve your
+repository::
+
+  $ hg evolve --all
+
+This rebases revision 20 on top of 18 as the new revision 21, leaving
+19 and 20 obsolete and hidden:
+
+.. figure:: figures/figure-ug09.svg
+
+   Figure 9: once again, ``hg evolve --all`` takes care of instability.
+
+Example 9: Uncommit files from an older changeset (discard changes)
+=======================================================================
+
+As in example 5, let's say you accidentally commit some unrelated
+changes together. Unlike example 5, you don't notice your mistake
+immediately, but commit a new changeset on top of the bad one. ::
+
+  $ echo 'this fixes bug 53' >> file1.c
+  $ echo 'debug hack' >> file2.c
+  $ hg commit -m 'fix bug 53'                     # rev 22 (oops)
+  $ echo 'and this handles bug 67' >> file1.c
+  $ hg commit -m 'fix bug 67'                     # rev 23 (fine)
+
+As with ``amend``, you need to travel back in time and repair revision
+22, leaving your changes to ``file2.c`` back in the working
+directory::
+
+  $ hg update 22
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg uncommit file2.c
+  1 new unstable changesets
+  $ hg status
+  M file2.c
+
+Now your repository has unstable changesets, so you need to evolve it.
+But ``hg evolve`` requires a clean working directory to resolve merge
+conflicts, so you need to decide what to do with ``file2.c``.
+
+In this case, the change to ``file2.c`` was a temporary debugging
+hack, so we can discard it and immediately evolve the instability away::
+
+  $ hg revert file2.c
+  $ hg evolve --all
+  move:[23] fix bug 67
+  atop:[24] fix bug 53
+
+Figure 10 illustrates the whole process.
+
+.. figure:: figures/figure-ug10.svg
+
+   Figure 10: ``hg uncommit`` of a changeset with descendants results
+   in instability *and* a dirty working directory, both of which must
+   be dealt with.
+
+
+Example 10: Uncommit files to an older changeset (keep changes)
+===================================================================
+
+This is very similar to example 9. The difference that this time, our
+change to ``file2.c`` is valuable enough to commit, making things a
+bit more complicated. The setup is nearly identical::
+
+  $ echo 'fix a bug' >> file1.c
+  $ echo 'useful but unrelated' >> file2.c
+  $ hg commit -u dan -d '11 0' -m 'fix a bug'     # rev 26 (oops)
+  $ echo 'new feature' >> file1.c
+  $ hg commit -u dan -d '12 0' -m 'new feature'   # rev 27 (fine)
+
+As before, we update back to the flawed changeset (this time,
+revision 26) and ``uncommit``, leaving uncommitted changes to
+``file2.c`` in the working dir::
+
+  $ 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
+  $ hg status
+  M file2.c
+
+This time, let's save that useful change before evolving::
+
+  $ hg commit -m 'useful tweak'                   # rev 29
+
+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 unstable
+revision 27.
+
+.. figure:: figures/figure-ug11.svg
+
+   Figure 11: Uncommitting a file and then committing that change
+   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::
+
+  $ hg evolve --all
+
+The problem is that ``hg evolve`` rebases revision 27 onto revision
+28, creating 30 (the successor of 27). This is entirely logical: 27
+was the child of 26, and 26's successor is 28. So of course 27's
+successor (30) should be the child of 26's successor (28).
+Unfortunately, that leaves us with a two-headed repository:
+
+.. figure:: figures/figure-ug12.svg
+
+   Figure 12: ``evolve`` takes care of unstable changesets; it does
+   not solve all the world's problems.
+
+As usual when faced with a two-headed repository, you can either merge
+or rebase. It's up to you.
+
+
+Example 11: Recover an obsolete changeset
+=========================================
+
+TODO
--- a/hgext/evolve.py	Fri Aug 08 15:50:26 2014 -0700
+++ b/hgext/evolve.py	Fri Aug 08 23:14:00 2014 -0700
@@ -58,11 +58,12 @@
 from mercurial import node
 from mercurial import phases
 from mercurial import patch
+from mercurial import pushkey
 from mercurial import revset
 from mercurial import scmutil
 from mercurial import templatekw
 from mercurial.i18n import _
-from mercurial.commands import walkopts, commitopts, commitopts2
+from mercurial.commands import walkopts, commitopts, commitopts2, mergetoolopts
 from mercurial.node import nullid
 from mercurial import wireproto
 from mercurial import localrepo
@@ -90,6 +91,18 @@
 # - Older format compat
 
 
+#####################################################################
+### Compatibility with core                                       ###
+#####################################################################
+
+
+def retractboundary(repo, tr, targetphase, nodes):
+    """Older mercurial version does not move phase within a transaction"""
+    try:
+        return phases.retractboundary(repo, tr, targetphase, nodes)
+    except TypeError:
+        return phases.retractboundary(repo, targetphase, nodes)
+
 
 #####################################################################
 ### Extension helper                                              ###
@@ -325,6 +338,25 @@
 ### experimental behavior                                         ###
 #####################################################################
 
+commitopts3 = [
+    ('D', 'current-date', None,
+     _('record the current date as commit date')),
+    ('U', 'current-user', None,
+     _('record the current user as committer')),
+]
+
+def _resolveoptions(ui, opts):
+    """modify commit options dict to handle related options
+
+    For now, all it does is figure out the commit date: respect -D unless
+    -d was supplied.
+    """
+    # N.B. this is extremely similar to setupheaderopts() in mq.py
+    if not opts.get('date') and opts.get('current_date'):
+        opts['date'] = '%d %d' % util.makedate()
+    if not opts.get('user') and opts.get('current_user'):
+        opts['user'] = ui.username()
+
 @eh.wrapfunction(mercurial.obsolete, 'createmarkers')
 def _createmarkers(orig, repo, relations, *args, **kwargs):
     """register parent information at prune time"""
@@ -435,7 +467,7 @@
     """``troubled()``
     Changesets with troubles.
     """
-    _ = revset.getargs(x, 0, 0, 'troubled takes no arguments')
+    revset.getargs(x, 0, 0, 'troubled takes no arguments')
     return repo.revs('%ld and (unstable() + bumped() + divergent())',
                      subset)
 
@@ -594,6 +626,13 @@
         return 'unstable'
     return 'stable'
 
+@eh.templatekw('troubles')
+def showtroubles(repo, ctx, **args):
+    """:troubles: List of strings. Evolution troubles affecting the changeset
+    (zero or more of "unstable", "divergent" or "bumped")."""
+    return templatekw.showlist('trouble', ctx.troubles(), plural='troubles',
+                               **args)
+
 #####################################################################
 ### Various trouble warning                                       ###
 #####################################################################
@@ -732,72 +771,67 @@
     base = old.p1()
     updatebookmarks = _bookmarksupdater(repo, old.node())
 
-    wlock = repo.wlock()
-    try:
-
-        # commit a new version of the old changeset, including the update
-        # collect all files which might be affected
-        files = set(old.files())
-        for u in updates:
-            files.update(u.files())
-
-        # Recompute copies (avoid recording a -> b -> a)
-        copied = copies.pathcopies(base, head)
-
-
-        # prune files which were reverted by the updates
-        def samefile(f):
-            if f in head.manifest():
-                a = head.filectx(f)
-                if f in base.manifest():
-                    b = base.filectx(f)
-                    return (a.data() == b.data()
-                            and a.flags() == b.flags())
-                else:
-                    return False
+    # commit a new version of the old changeset, including the update
+    # collect all files which might be affected
+    files = set(old.files())
+    for u in updates:
+        files.update(u.files())
+
+    # Recompute copies (avoid recording a -> b -> a)
+    copied = copies.pathcopies(base, head)
+
+
+    # prune files which were reverted by the updates
+    def samefile(f):
+        if f in head.manifest():
+            a = head.filectx(f)
+            if f in base.manifest():
+                b = base.filectx(f)
+                return (a.data() == b.data()
+                        and a.flags() == b.flags())
             else:
-                return f not in base.manifest()
-        files = [f for f in files if not samefile(f)]
-        # commit version of these files as defined by head
-        headmf = head.manifest()
-        def filectxfn(repo, ctx, path):
-            if path in headmf:
-                fctx = head[path]
-                flags = fctx.flags()
-                mctx = memfilectx(repo, fctx.path(), fctx.data(),
-                                  islink='l' in flags,
-                                  isexec='x' in flags,
-                                  copied=copied.get(path))
-                return mctx
-            raise IOError()
-
-        message = cmdutil.logmessage(repo.ui, commitopts)
-        if not message:
-            message = old.description()
-
-        user = commitopts.get('user') or old.user()
-        date = commitopts.get('date') or None # old.date()
-        extra = dict(commitopts.get('extra', {}))
-        extra['branch'] = head.branch()
-
-        new = context.memctx(repo,
-                             parents=newbases,
-                             text=message,
-                             files=files,
-                             filectxfn=filectxfn,
-                             user=user,
-                             date=date,
-                             extra=extra)
-
-        if commitopts.get('edit'):
-            new._text = cmdutil.commitforceeditor(repo, new, [])
-        revcount = len(repo)
-        newid = repo.commitctx(new)
-        new = repo[newid]
-        created = len(repo) != revcount
-        updatebookmarks(newid)
-    finally:
-        wlock.release()
+                return False
+        else:
+            return f not in base.manifest()
+    files = [f for f in files if not samefile(f)]
+    # commit version of these files as defined by head
+    headmf = head.manifest()
+    def filectxfn(repo, ctx, path):
+        if path in headmf:
+            fctx = head[path]
+            flags = fctx.flags()
+            mctx = memfilectx(repo, fctx.path(), fctx.data(),
+                              islink='l' in flags,
+                              isexec='x' in flags,
+                              copied=copied.get(path))
+            return mctx
+        raise IOError()
+
+    message = cmdutil.logmessage(repo.ui, commitopts)
+    if not message:
+        message = old.description()
+
+    user = commitopts.get('user') or old.user()
+    date = commitopts.get('date') or None # old.date()
+    extra = dict(commitopts.get('extra', {}))
+    extra['branch'] = head.branch()
+
+    new = context.memctx(repo,
+                         parents=newbases,
+                         text=message,
+                         files=files,
+                         filectxfn=filectxfn,
+                         user=user,
+                         date=date,
+                         extra=extra)
+
+    if commitopts.get('edit'):
+        new._text = cmdutil.commitforceeditor(repo, new, [])
+    revcount = len(repo)
+    newid = repo.commitctx(new)
+    new = repo[newid]
+    created = len(repo) != revcount
+    updatebookmarks(newid)
 
     return newid, created
 
@@ -806,27 +840,25 @@
 
 def relocate(repo, orig, dest):
     """rewrite <rev> on dest"""
+    if orig.rev() == dest.rev():
+        raise util.Abort(_('tried to relocate a node on top of itself'),
+                         hint=_("This shouldn't happen. If you still "
+                                "need to move changesets, please do so "
+                                "manually with nothing to rebase - working "
+                                "directory parent is also destination"))
+
+    rebase = extensions.find('rebase')
+    # dummy state to trick rebase node
+    if not orig.p2().rev() == node.nullrev:
+        raise util.Abort(
+            'no support for evolving merge changesets yet',
+            hint="Redo the merge a use `hg prune` to obsolete the old one")
+    destbookmarks = repo.nodebookmarks(dest.node())
+    nodesrc = orig.node()
+    destphase = repo[nodesrc].phase()
+    tr = repo.transaction('relocate')
     try:
-        if orig.rev() == dest.rev():
-            raise util.Abort(_('tried to relocate a node on top of itself'),
-                             hint=_("This shouldn't happen. If you still "
-                                    "need to move changesets, please do so "
-                                    "manually with nothing to rebase - working "
-                                    "directory parent is also destination"))
-
-        rebase = extensions.find('rebase')
-        # dummy state to trick rebase node
-        if not orig.p2().rev() == node.nullrev:
-            raise util.Abort(
-                'no support for evolving merge changesets yet',
-                hint="Redo the merge a use `hg prune` to obsolete the old one")
-        destbookmarks = repo.nodebookmarks(dest.node())
-        nodesrc = orig.node()
-        destphase = repo[nodesrc].phase()
-        wlock = lock = None
         try:
-            wlock = repo.wlock()
-            lock = repo.lock()
             r = rebase.rebasenode(repo, orig.node(), dest.node(),
                                   {node.nullrev: node.nullrev}, False)
             if r[-1]: #some conflict
@@ -840,11 +872,9 @@
                 pass
             exc.__class__ = LocalMergeFailure
             raise
-        finally:
-            lockmod.release(lock, wlock)
         oldbookmarks = repo.nodebookmarks(nodesrc)
         if nodenew is not None:
-            phases.retractboundary(repo, destphase, [nodenew])
+            retractboundary(repo, tr, destphase, [nodenew])
             createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))])
             for book in oldbookmarks:
                 repo._bookmarks[book] = nodenew
@@ -857,11 +887,10 @@
             repo._bookmarks[book] = dest.node()
         if oldbookmarks or destbookmarks:
             repo._bookmarks.write()
-        return nodenew
-    except util.Abort:
-        # Invalidate the previous setparents
-        repo.dirstate.invalidate()
-        raise
+        tr.close()
+    finally:
+        tr.release()
+    return nodenew
 
 def _bookmarksupdater(repo, oldid):
     """Return a callable update(newid) updating the current bookmark
@@ -994,9 +1023,7 @@
         tr.close()
         ui.progress(pgop, None)
     finally:
-        if tr is not None:
-            tr.release()
-        lockmod.release(lock, wlock)
+        lockmod.release(tr, lock, wlock)
 
 @command('debugobsstorestat', [], '')
 def cmddebugobsstorestat(ui, repo):
@@ -1124,9 +1151,13 @@
 @command('^evolve|stabilize|solve',
     [('n', 'dry-run', False,
         'do not perform actions, just print what would be done'),
-    ('A', 'any', False, 'evolve any troubled changeset'),
-    ('a', 'all', False, 'evolve all troubled changesets'),
-    ('c', 'continue', False, 'continue an interrupted evolution'), ],
+     ('', 'confirm', False,
+        'ask for confirmation before performing the action'),
+    ('A', 'any', False, 'also consider troubled changesets unrelated to current working directory'),
+    ('a', 'all', False, 'evolve all troubled changesets in the repo '
+                        '(implies any)'),
+    ('c', 'continue', False, 'continue an interrupted evolution'),
+    ] + mergetoolopts,
     _('[OPTIONS]...'))
 def evolve(ui, repo, **opts):
     """Solve trouble in your repository
@@ -1137,9 +1168,10 @@
     - update to a successor if the working directory parent is
       obsolete
 
-    By default, takes the first troubled changeset that looks relevant.
-
-    (The logic is still a bit fuzzy)
+    By default a single changeset is evolved for each invocation and only
+    troubled changesets that would evolve as a descendant of the current
+    working directory will be considered. See --all and --any options to change
+    this behavior.
 
     - For unstable, this means taking the first which could be rebased as a
       child of the working directory parent revision or one of its descendants
@@ -1156,6 +1188,8 @@
     anyopt = opts['any']
     allopt = opts['all']
     dryrunopt = opts['dry_run']
+    confirmopt = opts['confirm']
+    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'evolve')
 
     if contopt:
         if anyopt:
@@ -1165,8 +1199,8 @@
         graftcmd = commands.table['graft'][0]
         return graftcmd(ui, repo, old_obsolete=True, **{'continue': True})
 
-    tr = _picknexttroubled(ui, repo, anyopt or allopt)
-    if tr is None:
+    tro = _picknexttroubled(ui, repo, anyopt or allopt)
+    if tro is None:
         if repo['.'].obsolete():
             displayer = cmdutil.show_changeset(
                 ui, repo, {'template': shorttemplate})
@@ -1218,33 +1252,43 @@
     seen = 1
     count = allopt and _counttroubled(ui, repo) or 1
 
-    while tr is not None:
+    while tro is not None:
         progresscb()
-        result = _evolveany(ui, repo, tr, dryrunopt, progresscb=progresscb)
+        wlock = lock = tr = None
+        try:
+            wlock = repo.wlock()
+            lock = repo.lock()
+            tr = repo.transaction("evolve")
+            result = _evolveany(ui, repo, tro, dryrunopt, confirmopt,
+                                progresscb=progresscb)
+            tr.close()
+        finally:
+            lockmod.release(tr, lock, wlock)
         progresscb()
         seen += 1
         if not allopt:
             return result
         progresscb()
-        tr = _picknexttroubled(ui, repo, anyopt or allopt)
+        tro = _picknexttroubled(ui, repo, anyopt or allopt)
 
     if allopt:
         ui.progress('evolve', None)
 
 
-def _evolveany(ui, repo, tr, dryrunopt, progresscb):
+def _evolveany(ui, repo, tro, dryrunopt, confirmopt, progresscb):
     repo = repo.unfiltered()
-    tr = repo[tr.rev()]
+    tro = repo[tro.rev()]
     cmdutil.bailifchanged(repo)
-    troubles = tr.troubles()
+    troubles = tro.troubles()
     if 'unstable' in troubles:
-        return _solveunstable(ui, repo, tr, dryrunopt, progresscb)
+        return _solveunstable(ui, repo, tro, dryrunopt, confirmopt, progresscb)
     elif 'bumped' in troubles:
-        return _solvebumped(ui, repo, tr, dryrunopt, progresscb)
+        return _solvebumped(ui, repo, tro, dryrunopt, confirmopt, progresscb)
     elif 'divergent' in troubles:
         repo = repo.unfiltered()
-        tr = repo[tr.rev()]
-        return _solvedivergent(ui, repo, tr, dryrunopt, progresscb)
+        tro = repo[tro.rev()]
+        return _solvedivergent(ui, repo, tro, dryrunopt, confirmopt,
+                               progresscb)
     else:
         assert False  # WHAT? unknown troubles
 
@@ -1259,21 +1303,21 @@
 def _picknexttroubled(ui, repo, pickany=False, progresscb=None):
     """Pick a the next trouble changeset to solve"""
     if progresscb: progresscb()
-    tr = _stabilizableunstable(repo, repo['.'])
-    if tr is None:
+    tro = _stabilizableunstable(repo, repo['.'])
+    if tro is None:
         wdp = repo['.']
         if 'divergent' in wdp.troubles():
-            tr = wdp
-    if tr is None and pickany:
+            tro = wdp
+    if tro is None and pickany:
         troubled = list(repo.set('unstable()'))
         if not troubled:
             troubled = list(repo.set('bumped()'))
         if not troubled:
             troubled = list(repo.set('divergent()'))
         if troubled:
-            tr = troubled[0]
-
-    return tr
+            tro = troubled[0]
+
+    return tro
 
 def _stabilizableunstable(repo, pctx):
     """Return a changectx for an unstable changeset which can be
@@ -1297,7 +1341,8 @@
                 return child
     return None
 
-def _solveunstable(ui, repo, orig, dryrun=False, progresscb=None):
+def _solveunstable(ui, repo, orig, dryrun=False, confirm=False,
+                   progresscb=None):
     """Stabilize a unstable changeset"""
     obs = orig.parents()[0]
     if not obs.obsolete():
@@ -1322,12 +1367,13 @@
     target = targets[0]
     displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
     target = repo[target]
-    repo.ui.status(_('move:'))
-    if not ui.quiet:
+    if not ui.quiet or confirm:
+        repo.ui.write(_('move:'))
         displayer.show(orig)
-    repo.ui.status(_('atop:'))
-    if not ui.quiet:
+        repo.ui.write(_('atop:'))
         displayer.show(target)
+    if confirm and ui.prompt('perform evolve? [Ny]') != 'y':
+            raise util.Abort(_('evolve aborted by user'))
     if progresscb: progresscb()
     todo = 'hg rebase -r %s -d %s\n' % (orig, target)
     if dryrun:
@@ -1335,7 +1381,6 @@
     else:
         repo.ui.note(todo)
         if progresscb: progresscb()
-        lock = repo.lock()
         try:
             relocate(repo, orig, target)
         except MergeFailure:
@@ -1344,10 +1389,9 @@
             repo.ui.write_err(
                 _('fix conflict and run "hg evolve --continue"\n'))
             raise
-        finally:
-            lock.release()
-
-def _solvebumped(ui, repo, bumped, dryrun=False, progresscb=None):
+
+def _solvebumped(ui, repo, bumped, dryrun=False, confirm=False,
+                 progresscb=None):
     """Stabilize a bumped changeset"""
     # For now we deny bumped merge
     if len(bumped.parents()) > 1:
@@ -1360,12 +1404,13 @@
                          ' %s being a merge' % prec)
 
     displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
-    repo.ui.status(_('recreate:'))
-    if not ui.quiet:
+    if not ui.quiet or confirm:
+        repo.ui.write(_('recreate:'))
         displayer.show(bumped)
-    repo.ui.status(_('atop:'))
-    if not ui.quiet:
+        repo.ui.write(_('atop:'))
         displayer.show(prec)
+    if confirm and ui.prompt('perform evolve? [Ny]') != 'y':
+        raise util.Abort(_('evolve aborted by user'))
     if dryrun:
         todo = 'hg rebase --rev %s --dest %s;\n' % (bumped, prec.p1())
         repo.ui.write(todo)
@@ -1374,85 +1419,78 @@
         repo.ui.write('hg commit --msg "bumped update to %s"')
         return 0
     if progresscb: progresscb()
-    wlock = repo.wlock()
+    newid = tmpctx = None
+    tmpctx = bumped
+    bmupdate = _bookmarksupdater(repo, bumped.node())
+    # Basic check for common parent. Far too complicated and fragile
+    tr = repo.transaction('bumped-stabilize')
     try:
-        newid = tmpctx = None
-        tmpctx = bumped
-        lock = repo.lock()
-        try:
-            bmupdate = _bookmarksupdater(repo, bumped.node())
-            # Basic check for common parent. Far too complicated and fragile
-            tr = repo.transaction('bumped-stabilize')
+        if not list(repo.set('parents(%d) and parents(%d)', bumped, prec)):
+            # Need to rebase the changeset at the right place
+            repo.ui.status(
+                _('rebasing to destination parent: %s\n') % prec.p1())
             try:
-                if not list(repo.set('parents(%d) and parents(%d)', bumped, prec)):
-                    # Need to rebase the changeset at the right place
-                    repo.ui.status(
-                        _('rebasing to destination parent: %s\n') % prec.p1())
-                    try:
-                        tmpid = relocate(repo, bumped, prec.p1())
-                        if tmpid is not None:
-                            tmpctx = repo[tmpid]
-                            createmarkers(repo, [(bumped, (tmpctx,))])
-                    except MergeFailure:
-                        repo.opener.write('graftstate', bumped.hex() + '\n')
-                        repo.ui.write_err(_('evolution failed!\n'))
-                        repo.ui.write_err(
-                            _('fix conflict and run "hg evolve --continue"\n'))
-                        raise
-                # Create the new commit context
-                repo.ui.status(_('computing new diff\n'))
-                files = set()
-                copied = copies.pathcopies(prec, bumped)
-                precmanifest = prec.manifest()
-                for key, val in bumped.manifest().iteritems():
-                    if precmanifest.pop(key, None) != 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 = memfilectx(repo, fctx.path(), fctx.data(),
-                                              islink='l' in flags,
-                                              isexec='x' in flags,
-                                              copied=copied.get(path))
-                            return mctx
-                        raise IOError()
-                    text = 'bumped update to %s:\n\n' % prec
-                    text += bumped.description()
-
-                    new = context.memctx(repo,
-                                         parents=[prec.node(), node.nullid],
-                                         text=text,
-                                         files=files,
-                                         filectxfn=filectxfn,
-                                         user=bumped.user(),
-                                         date=bumped.date(),
-                                         extra=bumped.extra())
-
-                    newid = repo.commitctx(new)
-                if newid is None:
-                    createmarkers(repo, [(tmpctx, ())])
-                    newid = prec.node()
-                else:
-                    phases.retractboundary(repo, bumped.phase(), [newid])
-                    createmarkers(repo, [(tmpctx, (repo[newid],))],
-                                           flag=obsolete.bumpedfix)
-                bmupdate(newid)
-                tr.close()
-                repo.ui.status(_('committed as %s\n') % node.short(newid))
-            finally:
-                tr.release()
-        finally:
-            lock.release()
-        # reroute the working copy parent to the new changeset
-        repo.dirstate.setparents(newid, node.nullid)
+                tmpid = relocate(repo, bumped, prec.p1())
+                if tmpid is not None:
+                    tmpctx = repo[tmpid]
+                    createmarkers(repo, [(bumped, (tmpctx,))])
+            except MergeFailure:
+                repo.opener.write('graftstate', bumped.hex() + '\n')
+                repo.ui.write_err(_('evolution failed!\n'))
+                repo.ui.write_err(
+                    _('fix conflict and run "hg evolve --continue"\n'))
+                raise
+        # Create the new commit context
+        repo.ui.status(_('computing new diff\n'))
+        files = set()
+        copied = copies.pathcopies(prec, bumped)
+        precmanifest = prec.manifest()
+        for key, val in bumped.manifest().iteritems():
+            if precmanifest.pop(key, None) != 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 = memfilectx(repo, fctx.path(), fctx.data(),
+                                      islink='l' in flags,
+                                      isexec='x' in flags,
+                                      copied=copied.get(path))
+                    return mctx
+                raise IOError()
+            text = 'bumped update to %s:\n\n' % prec
+            text += bumped.description()
+
+            new = context.memctx(repo,
+                                 parents=[prec.node(), node.nullid],
+                                 text=text,
+                                 files=files,
+                                 filectxfn=filectxfn,
+                                 user=bumped.user(),
+                                 date=bumped.date(),
+                                 extra=bumped.extra())
+
+            newid = repo.commitctx(new)
+        if newid is None:
+            createmarkers(repo, [(tmpctx, ())])
+            newid = prec.node()
+        else:
+            retractboundary(repo, tr, bumped.phase(), [newid])
+            createmarkers(repo, [(tmpctx, (repo[newid],))],
+                                   flag=obsolete.bumpedfix)
+        bmupdate(newid)
+        tr.close()
+        repo.ui.status(_('committed as %s\n') % node.short(newid))
     finally:
-        wlock.release()
-
-def _solvedivergent(ui, repo, divergent, dryrun=False, progresscb=None):
+        tr.release()
+    # reroute the working copy parent to the new changeset
+    repo.dirstate.setparents(newid, node.nullid)
+
+def _solvedivergent(ui, repo, divergent, dryrun=False, confirm=False,
+                    progresscb=None):
     base, others = divergentdata(divergent)
     if len(others) > 1:
         othersstr = "[%s]" % (','.join([str(i) for i in others]))
@@ -1467,7 +1505,7 @@
                 "| You should contact your local evolution Guru for help.\n"
                 % (divergent, othersstr))
         raise util.Abort("we do not handle divergence with split yet",
-                         hint='')
+                         hint=hint)
     other = others[0]
     if divergent.phase() <= phases.public:
         raise util.Abort("we can't resolve this conflict from the public side",
@@ -1489,15 +1527,15 @@
                               % {'d': divergent, 'o': other})
 
     displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
-    ui.status(_('merge:'))
-    if not ui.quiet:
+    if not ui.quiet or confirm:
+        ui.write(_('merge:'))
         displayer.show(divergent)
-    ui.status(_('with: '))
-    if not ui.quiet:
+        ui.write(_('with: '))
         displayer.show(other)
-    ui.status(_('base: '))
-    if not ui.quiet:
+        ui.write(_('base: '))
         displayer.show(base)
+    if confirm and ui.prompt('perform evolve? [Ny]') != 'y':
+        raise util.Abort(_('evolve aborted by user'))
     if dryrun:
         ui.write('hg update -c %s &&\n' % divergent)
         ui.write('hg merge %s &&\n' % other)
@@ -1508,55 +1546,48 @@
         ui.write('hg commit -m "`hg log -r %s --template={desc}`";\n'
                  % divergent)
         return
-    wlock = lock = None
-    try:
-        wlock = repo.wlock()
-        lock = repo.lock()
-        if divergent not in repo[None].parents():
-            repo.ui.status(_('updating to "local" conflict\n'))
-            hg.update(repo, divergent.rev())
-        repo.ui.note(_('merging divergent changeset\n'))
-        if progresscb: progresscb()
-        stats = merge.update(repo,
-                             other.node(),
-                             branchmerge=True,
-                             force=False,
-                             partial=None,
-                             ancestor=base.node(),
-                             mergeancestor=True)
-        hg._showstats(repo, stats)
-        if stats[3]:
-            repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
-                             "or 'hg update -C .' to abandon\n"))
-        if stats[3] > 0:
-            raise util.Abort('merge conflict between several amendments '
-                '(this is not automated yet)',
-                hint="""/!\ You can try:
+    if divergent not in repo[None].parents():
+        repo.ui.status(_('updating to "local" conflict\n'))
+        hg.update(repo, divergent.rev())
+    repo.ui.note(_('merging divergent changeset\n'))
+    if progresscb: progresscb()
+    stats = merge.update(repo,
+                         other.node(),
+                         branchmerge=True,
+                         force=False,
+                         partial=None,
+                         ancestor=base.node(),
+                         mergeancestor=True)
+    hg._showstats(repo, stats)
+    if stats[3]:
+        repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
+                         "or 'hg update -C .' to abandon\n"))
+    if stats[3] > 0:
+        raise util.Abort('merge conflict between several amendments '
+            '(this is not automated yet)',
+            hint="""/!\ You can try:
 /!\ * manual merge + resolve => new cset X
 /!\ * hg up to the parent of the amended changeset (which are named W and Z)
 /!\ * hg revert --all -r X
 /!\ * hg ci -m "same message as the amended changeset" => new cset Y
 /!\ * hg kill -n Y W Z
 """)
-        if progresscb: progresscb()
-        tr = repo.transaction('stabilize-divergent')
-        try:
-            repo.dirstate.setparents(divergent.node(), node.nullid)
-            oldlen = len(repo)
-            amend(ui, repo, message='', logfile='')
-            if oldlen == len(repo):
-                new = divergent
-                # no changes
-            else:
-                new = repo['.']
-            createmarkers(repo, [(other, (new,))])
-            phases.retractboundary(repo, other.phase(), [new.node()])
-            tr.close()
-        finally:
-            tr.release()
+    if progresscb: progresscb()
+    tr = repo.transaction('stabilize-divergent')
+    try:
+        repo.dirstate.setparents(divergent.node(), node.nullid)
+        oldlen = len(repo)
+        amend(ui, repo, message='', logfile='')
+        if oldlen == len(repo):
+            new = divergent
+            # no changes
+        else:
+            new = repo['.']
+        createmarkers(repo, [(other, (new,))])
+        retractboundary(repo, tr, other.phase(), [new.node()])
+        tr.close()
     finally:
-        lockmod.release(lock, wlock)
-
+        tr.release()
 
 def divergentdata(ctx):
     """return base, other part of a conflict
@@ -1725,9 +1756,9 @@
         raise util.Abort(_('nothing to prune'))
 
     wlock = lock = None
-    wlock = repo.wlock()
-    sortedrevs = lambda specs: sorted(set(scmutil.revrange(repo, specs)))
     try:
+        wlock = repo.wlock()
+        sortedrevs = lambda specs: sorted(set(scmutil.revrange(repo, specs)))
         lock = repo.lock()
         # defines pruned changesets
         precs = []
@@ -1796,7 +1827,7 @@
     ('', 'close-branch', None,
      _('mark a branch as closed, hiding it from the branch list')),
     ('s', 'secret', None, _('use the secret phase for committing')),
-    ] + walkopts + commitopts + commitopts2,
+    ] + walkopts + commitopts + commitopts2 + commitopts3,
     _('[OPTION]... [FILE]...'))
 def amend(ui, repo, *pats, **opts):
     """combine a changeset with updates and replace it with a new one
@@ -1821,6 +1852,7 @@
     opts['amend'] = True
     if not (edit or opts['message']):
         opts['message'] = repo['.'].description()
+    _resolveoptions(ui, opts)
     _alias, commitcmd = cmdutil.findcmd('commit', commands.table)
     return commitcmd[0](ui, repo, *pats, **opts)
 
@@ -1923,43 +1955,46 @@
 
     Return 0 if changed files are uncommitted.
     """
-    lock = repo.lock()
+
+    wlock = lock = tr = None
     try:
         wlock = repo.wlock()
-        try:
-            wctx = repo[None]
-            if len(wctx.parents()) <= 0:
-                raise util.Abort(_("cannot uncommit null changeset"))
-            if len(wctx.parents()) > 1:
-                raise util.Abort(_("cannot uncommit while merging"))
-            old = repo['.']
-            if old.phase() == phases.public:
-                raise util.Abort(_("cannot rewrite immutable changeset"))
-            if len(old.parents()) > 1:
-                raise util.Abort(_("cannot uncommit merge changeset"))
-            oldphase = old.phase()
-            updatebookmarks = _bookmarksupdater(repo, old.node())
-            # Recommit the filtered changeset
-            newid = None
-            if (pats or opts.get('include') or opts.get('exclude')
-                or opts.get('all')):
-                match = scmutil.match(old, pats, opts)
-                newid = _commitfiltered(repo, old, match)
-            if newid is None:
-                raise util.Abort(_('nothing to uncommit'))
-            # Move local changes on filtered changeset
-            createmarkers(repo, [(old, (repo[newid],))])
-            phases.retractboundary(repo, oldphase, [newid])
-            repo.dirstate.setparents(newid, node.nullid)
-            _uncommitdirstate(repo, old, match)
-            updatebookmarks(newid)
-            if not repo[newid].files():
-                ui.warn(_("new changeset is empty\n"))
-                ui.status(_('(use "hg prune ." to remove it)\n'))
-        finally:
-            wlock.release()
+        lock = repo.lock()
+        wctx = repo[None]
+        if len(wctx.parents()) <= 0:
+            raise util.Abort(_("cannot uncommit null changeset"))
+        if len(wctx.parents()) > 1:
+            raise util.Abort(_("cannot uncommit while merging"))
+        old = repo['.']
+        if old.phase() == phases.public:
+            raise util.Abort(_("cannot rewrite immutable changeset"))
+        if len(old.parents()) > 1:
+            raise util.Abort(_("cannot uncommit merge changeset"))
+        oldphase = old.phase()
+        updatebookmarks = _bookmarksupdater(repo, old.node())
+
+        # Recommit the filtered changeset
+        tr = repo.transaction('uncommit')
+        newid = None
+        if (pats or opts.get('include') or opts.get('exclude')
+            or opts.get('all')):
+            match = scmutil.match(old, pats, opts)
+            newid = _commitfiltered(repo, old, match)
+        if newid is None:
+            raise util.Abort(_('nothing to uncommit'),
+                             hint=_("use --all to uncommit all files"))
+        # Move local changes on filtered changeset
+        createmarkers(repo, [(old, (repo[newid],))])
+        retractboundary(repo, tr, oldphase, [newid])
+        repo.dirstate.setparents(newid, node.nullid)
+        _uncommitdirstate(repo, old, match)
+        updatebookmarks(newid)
+        if not repo[newid].files():
+            ui.warn(_("new changeset is empty\n"))
+            ui.status(_('(use "hg prune ." to remove it)\n'))
+        tr.close()
     finally:
-        lock.release()
+        lockmod.release(tr, lock, wlock)
 
 @eh.wrapcommand('commit')
 def commitwrapper(orig, ui, repo, *arg, **kwargs):
@@ -2029,14 +2064,14 @@
                 p2 = ctx.p2().node()
                 p1 = newmapping.get(p1, p1)
                 p2 = newmapping.get(p2, p2)
-                new, _ = rewrite(repo, ctx, [], ctx,
-                                 [p1, p2],
-                                 commitopts={'extra': extra})
+                new, unusedvariable = rewrite(repo, ctx, [], ctx,
+                                              [p1, p2],
+                                              commitopts={'extra': extra})
                 # store touched version to help potential children
                 newmapping[ctx.node()] = new
                 if not duplicate:
                     createmarkers(repo, [(ctx, (repo[new],))])
-                phases.retractboundary(repo, ctx.phase(), [new])
+                retractboundary(repo, tr, ctx.phase(), [new])
                 if ctx in repo[None].parents():
                     repo.dirstate.setparents(new, node.nullid)
             tr.close()
@@ -2046,41 +2081,76 @@
         lockmod.release(lock, wlock)
 
 @command('^fold|squash',
-    [('r', 'rev', [], _("explicitly specify the full set of revision to fold")),
+    [('r', 'rev', [], _("revision to fold")),
+     ('', 'exact', None, _("only fold specified revisions"))
     ] + commitopts + commitopts2,
-    # allow to choose the seed ?
-    _('rev'))
+    _('hg fold [OPTION]... [-r] REV'))
 def fold(ui, repo, *revs, **opts):
-    """Fold multiple revisions into a single one
-
-    The revisions from your current working directory to the given one are folded
-    into a single successor revision.
-
-    you can alternatively use --rev to explicitly specify revisions to be folded,
-    ignoring the current working directory parent.
+    """fold multiple revisions into a single one
+
+    Folds a set of revisions with the parent of the working directory.
+    All revisions linearly between the given revisions and the parent
+    of the working directory will also be folded.
+
+    Use --exact for folding only the specified revisions while ignoring the
+    parent of the working directory. In this case, the given revisions must
+    form a linear unbroken chain.
+
+    .. container:: verbose
+
+     Some examples:
+
+     - Fold the current revision with its parent::
+
+         hg fold .^
+
+     - Fold all draft revisions with working directory parent::
+
+         hg fold 'draft()'
+
+       See :hg:`help phases` for more about draft revisions and
+       :hg:`help revsets` for more about the `draft()` keyword
+
+     - Fold revisions 3, 4, 5, and 6 with the working directory parent::
+
+         hg fold 3:6
+
+     - Only fold revisions linearly between foo and @::
+
+         hg fold foo::@ --exact
     """
     revs = list(revs)
-    if revs:
-        if opts.get('rev', ()):
-            raise util.Abort("cannot specify both --rev and a target revision")
-        targets = scmutil.revrange(repo, revs)
-        revs = repo.revs('(%ld::.) or (.::%ld)', targets, targets)
-    elif 'rev' in opts:
-        revs = scmutil.revrange(repo, opts['rev'])
-    else:
-        revs = ()
+    revs.extend(opts['rev'])
     if not revs:
-        ui.write_err('no revision to fold\n')
+        raise util.Abort(_('no revisions specified'))
+
+    revs = scmutil.revrange(repo, revs)
+
+    if not opts['exact']:
+        # Try to extend given revision starting from the working directory
+        extrevs = repo.revs('(%ld::.) or (.::%ld)', revs, revs)
+        discardedrevs = [r for r in revs if r not in extrevs]
+        if discardedrevs:
+            raise util.Abort(_("cannot fold non-linear revisions"),
+                               hint=_("given revisions are unrelated to parent "
+                                      "of working directory"))
+        revs = extrevs
+
+    if len(revs) == 1:
+        ui.write_err(_('single revision specified, nothing to fold\n'))
         return 1
+
     roots = repo.revs('roots(%ld)', revs)
     if len(roots) > 1:
-        raise util.Abort("set has multiple roots")
+        raise util.Abort(_("cannot fold non-linear revisions "
+                           "(multiple roots given)"))
     root = repo[roots[0]]
     if root.phase() <= phases.public:
-        raise util.Abort("can't fold public revisions")
+        raise util.Abort(_("cannot fold public revisions"))
     heads = repo.revs('heads(%ld)', revs)
     if len(heads) > 1:
-        raise util.Abort("set has multiple heads")
+        raise util.Abort(_("cannot fold non-linear revisions "
+                           "(multiple heads given)"))
     head = repo[heads[0]]
     wlock = lock = None
     try:
@@ -2101,10 +2171,10 @@
                 commitopts['message'] =  "\n".join(msgs)
                 commitopts['edit'] = True
 
-            newid, _ = rewrite(repo, root, allctx, head,
-                             [root.p1().node(), root.p2().node()],
-                             commitopts=commitopts)
-            phases.retractboundary(repo, targetphase, [newid])
+            newid, unusedvariable = rewrite(repo, root, allctx, head,
+                                            [root.p1().node(), root.p2().node()],
+                                            commitopts=commitopts)
+            retractboundary(repo, tr, targetphase, [newid])
             createmarkers(repo, [(ctx, (repo[newid],))
                                  for ctx in allctx])
             tr.close()
@@ -2156,17 +2226,32 @@
 
     entry = cmdutil.findcmd('commit', commands.table)[1]
     entry[1].append(('o', 'obsolete', [],
-                     _("make commit obsolete this revision")))
+                     _("make commit obsolete this revision (DEPRECATED)")))
     entry = cmdutil.findcmd('graft', commands.table)[1]
     entry[1].append(('o', 'obsolete', [],
-                     _("make graft obsoletes this revision")))
+                     _("make graft obsoletes this revision (DEPRECATED)")))
     entry[1].append(('O', 'old-obsolete', False,
-                     _("make graft obsoletes its source")))
+                     _("make graft obsoletes its source (DEPRECATED)")))
 
 #####################################################################
 ### Obsolescence marker exchange experimenation                   ###
 #####################################################################
 
+def obsexcmsg(ui, message, important=False):
+    verbose = ui.configbool('experimental', 'verbose-obsolescence-exchange',
+                             False)
+    if verbose:
+        message = 'OBSEXC: ' + message
+    if important or verbose:
+        ui.status(message)
+
+def obsexcprg(ui, *args, **kwargs):
+    topic = 'obsmarkers exchange'
+    if ui.configbool('experimental', 'verbose-obsolescence-exchange', False):
+        topic = 'OBSEXC'
+    ui.progress(topic, *args, **kwargs)
+
+
 @command('debugobsoleterelevant',
          [],
          'REVSET')
@@ -2244,8 +2329,7 @@
         return len(self.getvalue())
 
     def read(self, size):
-        self.ui.progress('OBSEXC', self.tell(), unit="bytes",
-                         total=self.length)
+        obsexcprg(self.ui, self.tell(), unit="bytes", total=self.length)
         return StringIO.read(self, size)
 
     def __iter__(self):
@@ -2254,11 +2338,145 @@
             yield d
             d = self.read(4096)
 
-
+bundle2partsgenerators = getattr(exchange, 'bundle2partsgenerators', None)
+
+
+if bundle2partsgenerators is not None:
+
+    def _pushb2phases(pushop, bundler):
+        """adds phases update to the main bundle2 push"""
+        outgoing = pushop.outgoing
+        unfi = pushop.repo.unfiltered()
+        remotephases = pushop.remote.listkeys('phases')
+        publishing = remotephases.get('publishing', False)
+        ana = phases.analyzeremotephases(pushop.repo,
+                                         outgoing.commonheads,
+                                         remotephases)
+        pheads, droots = ana
+        revset = 'heads((%ln::%ln))'
+        if not publishing:
+            revset += ' and public()'
+        # Get the list of all revs draft on remote by public here.
+        # XXX Beware that revset break if droots is not strictly
+        # XXX root we may want to ensure it is but it is costly
+        fallback = list(unfi.set(revset, droots, outgoing.commonheads))
+        if not outgoing.missing:
+            future = fallback
+        else:
+            # adds changeset we are going to push as draft
+            #
+            # should not be necessary for pushblishing server, but because of
+            # an issue fixed in xxxxx we have to do it anyway.
+            fdroots = list(unfi.set('roots(%ln  + %ln::)', outgoing.missing, droots))
+            fdroots = [f.node() for f in fdroots]
+            future = list(unfi.set(revset, fdroots, outgoing.missingheads))
+
+        b2caps = bundle2.bundle2caps(pushop.remote)
+        if 'b2x:pushkey' not in b2caps:
+            return
+        pushop.stepsdone.add('phases')
+        part2node = []
+        enc = pushkey.encode
+        for newremotehead in future:
+            part = bundler.newpart('b2x:pushkey')
+            part.addparam('namespace', enc('phases'))
+            part.addparam('key', enc(newremotehead.hex()))
+            part.addparam('old', enc(str(phases.draft)))
+            part.addparam('new', enc(str(phases.public)))
+            part2node.append((part.id, newremotehead))
+        def handlereply(op):
+            for partid, pnode in part2node:
+                partrep = op.records.getreplies(partid)
+                results = partrep['pushkey']
+                assert len(results) <= 1
+                msg = None
+                if not results:
+                    msg = _('server ignored update of %s to public!\n') % pnode
+                elif not int(results[0]['return']):
+                    msg = _('updating %s to public failed!\n') % pnode
+                if msg is not None:
+                    pushop.ui.warn(msg)
+        return handlereply
+
+    def _pushb2obsmarker(pushop, bundler):
+        """adds obsmarker to the main bundle2 push"""
+        repo = pushop.repo
+        remote = pushop.remote
+        if ('obsmarkers' not in pushop.stepsdone
+            and (obsolete._enabled and repo.obsstore and
+                 'obsolete' in remote.listkeys('namespaces'))
+            and remote.capable('_evoext_b2x_obsmarkers_0')):
+            #
+            pushop.stepsdone.add('obsmarkers')
+            markers = _obsmarkersdiscovery(pushop)
+            if not markers:
+                obsexcmsg(repo.ui, "no marker to push\n")
+                obsexcmsg(repo.ui, "DONE\n")
+                return
+            obsdata = pushobsmarkerStringIO()
+            _encodemarkersstream(obsdata, markers)
+            obsdata.seek(0)
+            obsdata.ui = repo.ui
+            obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
+                               % (len(markers), len(obsdata.getvalue())),
+                      True)
+            bundler.newpart('EVOLVE:B2X:OBSMARKERV1', data=obsdata)
+            def callback(op):
+                obsexcprg(repo.ui, None)
+                obsexcmsg(repo.ui, "DONE\n")
+            return callback
+    bundle2partsgenerators.append(_pushb2phases)
+    bundle2partsgenerators.append(_pushb2obsmarker)
+
+
+def _obsmarkersdiscovery(pushop):
+    """return the list of marker that needs to be pushed to the server
+
+    When used before (or at the same time) the changegroup have been pushed, it
+    returns the value as if the planned changegroup was succesful. Othewise it
+    use te actual common heads to decide whats needs to be pushed.
+    """
+    repo = pushop.repo
+    remote = pushop.remote
+    unfi = repo.unfiltered()
+    cl = unfi.changelog
+    commonheads = pushop.commonheads
+    if commonheads is None:
+        if pushop.revs is None:
+            commonheads = pushop.outgoing.commonheads
+            sch = set(commonheads)
+            commonheads.extend(h for h in pushop.outgoing.missingheads
+                               if h not in sch)
+        else:
+            commonheads = pushop.outgoing.missingheads
+    if (obsolete._enabled and repo.obsstore and
+        'obsolete' in remote.listkeys('namespaces')):
+        obsexcmsg(repo.ui, "computing relevant nodes\n")
+        revs = unfi.revs('::%ln', commonheads)
+        common = []
+        if remote.capable('_evoext_obshash_0'):
+            obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
+                               % len(revs))
+            common = findcommonobsmarkers(pushop.ui, unfi, remote, revs)
+            revs = list(unfi.revs('%ld - (::%ln)', revs, common))
+        nodes = [cl.node(r) for r in revs]
+        if nodes:
+            obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
+                               % len(nodes))
+            markers = repo.obsstore.relevantmarkers(nodes)
+        else:
+            obsexcmsg(repo.ui, "markers already in sync\n")
+            markers = []
+        return markers
 
 @eh.wrapfunction(exchange, '_pushobsolete')
 def _pushobsolete(orig, pushop):
     """utility function to push obsolete markers to a remote"""
+    stepsdone = getattr(pushop, 'stepsdone', None)
+    if stepsdone is not None:
+        if 'obsmarkers' in stepsdone:
+            return
+        stepsdone.add('obsmarkers')
     pushop.ui.debug('try to push obsolete markers to remote\n')
     repo = pushop.repo
     remote = pushop.remote
@@ -2266,31 +2484,17 @@
     cl = unfi.changelog
     if (obsolete._enabled and repo.obsstore and
         'obsolete' in remote.listkeys('namespaces')):
-        repo.ui.status("OBSEXC: computing relevant nodes\n")
-        revs = unfi.revs('::%ln', pushop.commonheads)
-        common = []
-        if remote.capable('_evoext_obshash_0'):
-            repo.ui.status("OBSEXC: looking for common markers in %i nodes\n"
-                           % len(revs))
-            common = findcommonobsmarkers(pushop.ui, repo, remote, revs)
-            revs = list(unfi.revs('%ld - (::%ln)', revs, common))
-        nodes = [cl.node(r) for r in revs]
-        if nodes:
-            repo.ui.status("OBSEXC: computing markers relevant to %i nodes\n"
-                           % len(nodes))
-            markers = repo.obsstore.relevantmarkers(nodes)
-        else:
-            repo.ui.status("OBSEXC: markers already in sync\n")
-            markers = []
+        markers = _obsmarkersdiscovery(pushop)
         if not markers:
-            repo.ui.status("OBSEXC: no marker to push\n")
+            obsexcmsg(repo.ui, "no marker to push\n")
         elif remote.capable('_evoext_b2x_obsmarkers_0'):
             obsdata = pushobsmarkerStringIO()
             _encodemarkersstream(obsdata, markers)
             obsdata.seek(0)
             obsdata.ui = repo.ui
-            repo.ui.status("OBSEXC: pushing %i markers (%i bytes)\n"
-                           % (len(markers), len(obsdata.getvalue())))
+            obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
+                               % (len(markers), len(obsdata.getvalue())),
+                      True)
             bundler = bundle2.bundle20(pushop.ui, {})
             capsblob = bundle2.encodecaps(pushop.repo.bundle2caps)
             bundler.addpart(bundle2.bundlepart('b2x:replycaps', data=capsblob))
@@ -2305,35 +2509,37 @@
                 op = bundle2.processbundle(pushop.repo, reply)
             except bundle2.UnknownPartError, exc:
                 raise util.Abort('missing support for %s' % exc)
-            repo.ui.progress('OBSEXC', None)
+            obsexcprg(repo.ui, None)
         elif remote.capable('_evoext_pushobsmarkers_0'):
             obsdata = pushobsmarkerStringIO()
             _encodemarkersstream(obsdata, markers)
             obsdata.seek(0)
             obsdata.ui = repo.ui
-            repo.ui.status("OBSEXC: pushing %i markers (%i bytes)\n"
-                           % (len(markers), len(obsdata.getvalue())))
+            obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
+                               % (len(markers), len(obsdata.getvalue())),
+                      True)
             remote.evoext_pushobsmarkers_0(obsdata)
-            repo.ui.progress('OBSEXC', None)
+            obsexcprg(repo.ui, None)
         else:
             rslts = []
             remotedata = _pushkeyescape(markers).items()
             totalbytes = sum(len(d) for k,d in remotedata)
             sentbytes = 0
-            repo.ui.status("OBSEXC: pushing %i markers in %i pushkey payload (%i bytes)\n"
-                            % (len(markers), len(remotedata), totalbytes))
+            obsexcmsg(repo.ui, "pushing %i obsolescence markers in %i pushkey payload (%i bytes)\n"
+                                % (len(markers), len(remotedata), totalbytes),
+                      True)
             for key, data in remotedata:
-                repo.ui.progress('OBSEXC', sentbytes, item=key, unit="bytes",
-                                 total=totalbytes)
+                obsexcprg(repo.ui, sentbytes, item=key, unit="bytes",
+                          total=totalbytes)
                 rslts.append(remote.pushkey('obsolete', key, '', data))
                 sentbytes += len(data)
-                repo.ui.progress('OBSEXC', sentbytes, item=key, unit="bytes",
-                                 total=totalbytes)
-            repo.ui.progress('OBSEXC', None)
+                obsexcprg(repo.ui, sentbytes, item=key, unit="bytes",
+                          total=totalbytes)
+            obsexcprg(repo.ui, None)
             if [r for r in rslts if not r]:
                 msg = _('failed to push some obsolete markers!\n')
                 repo.ui.warn(msg)
-        repo.ui.status("OBSEXC: DONE\n")
+        obsexcmsg(repo.ui, "DONE\n")
 
 
 @eh.addattr(wireproto.wirepeer, 'evoext_pushobsmarkers_0')
@@ -2391,13 +2597,13 @@
         length = int(length)
         data = StringIO()
         current = 0
-        op.ui.progress('OBSEXC', current, unit="bytes", total=length)
+        obsexcprg(op.repo.ui, current, unit="bytes", total=length)
         while current < length:
             readsize = min(length-current, 4096)
             data.write(inpart.read(readsize))
             current += readsize
-            op.ui.progress('OBSEXC', current, unit="bytes", total=length)
-        op.ui.progress('OBSEXC', None)
+            obsexcprg(op.repo.ui, current, unit="bytes", total=length)
+        obsexcprg(op.repo.ui, None)
         obsdata = data.getvalue()
     totalsize = len(obsdata)
     old = len(op.repo.obsstore._all)
@@ -2418,8 +2624,8 @@
     revs = unfi.revs('::%ln', pullop.pulledsubset)
     common = [nullid]
     if remote.capable('_evoext_obshash_0'):
-        repo.ui.status("OBSEXC: looking for common markers in %i nodes\n"
-                       % len(revs))
+        obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
+                           % len(revs))
         common = findcommonobsmarkers(repo.ui, repo, remote, revs)
     return {'heads': pullop.pulledsubset, 'common': common}
 
@@ -2464,8 +2670,12 @@
         return None # remote opted out of obsolescence marker exchange
     tr = None
     ui = pullop.repo.ui
-    ui.status("OBSEXC: pull obsolescence markers\n")
     boundaries = _buildpullobsmerkersboundaries(pullop)
+    if not set(boundaries['heads']) - set(boundaries['common']):
+        obsexcmsg(ui, "nothing to pull\n")
+        return None
+
+    obsexcmsg(ui, "pull obsolescence markers\n", True)
     new = 0
 
     if b2xpull:
@@ -2487,27 +2697,27 @@
             bytes += entry.get('bytes', 0)
             new += entry.get('new', 0)
         if 5 < bytes:
-            ui.status("OBSEXC: merging obsolescence markers (%i bytes)\n"
+            obsexcmsg(ui, "merging obsolescence markers (%i bytes)\n"
                       % bytes)
-            ui.status("OBSEXC: %i markers added\n" % new)
+            obsexcmsg(ui, "%i obsolescence markers added\n" % new, True)
             tr = op.gettransaction()
         else:
-            ui.status("OBSEXC: no unknown remote markers\n")
-        ui.status("OBSEXC: DONE\n")
+            obsexcmsg(ui, "no unknown remote markers\n")
+        obsexcmsg(ui, "DONE\n")
     elif wirepull:
         obsdata = pullop.remote.evoext_pullobsmarkers_0(**boundaries)
         obsdata = obsdata.read()
         if len(obsdata) > 5:
-            ui.status("OBSEXC: merging obsolescence markers (%i bytes)\n"
+            obsexcmsg(ui, "merging obsolescence markers (%i bytes)\n"
                            % len(obsdata))
             tr = pullop.gettransaction()
             old = len(pullop.repo.obsstore._all)
             pullop.repo.obsstore.mergemarkers(tr, obsdata)
             new = len(pullop.repo.obsstore._all) - old
-            ui.status("OBSEXC: %i markers added\n" % new)
+            obsexcmsg(ui, "%i obsolescence markers added\n" % new, True)
         else:
-            ui.status("OBSEXC: no unknown remote markers\n")
-        ui.status("OBSEXC: DONE\n")
+            obsexcmsg(ui, "no unknown remote markers\n")
+        obsexcmsg(ui, "DONE\n")
     if new:
         pullop.repo.invalidatevolatilesets()
     return tr
@@ -2551,13 +2761,13 @@
     current = 0
     data = StringIO()
     ui = self.ui
-    ui.progress('OBSEXC', current, unit="bytes", total=length)
+    obsexcprg(ui, current, unit="bytes", total=length)
     while current < length:
         readsize = min(length-current, chunk)
         data.write(f.read(readsize))
         current += readsize
-        ui.progress('OBSEXC', current, unit="bytes", total=length)
-    ui.progress('OBSEXC', None)
+        obsexcprg(ui, current, unit="bytes", total=length)
+    obsexcprg(ui, None)
     data.seek(0)
     return data
 
--- a/tests/_exc-util.sh	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/_exc-util.sh	Fri Aug 08 23:14:00 2014 -0700
@@ -8,6 +8,8 @@
 logtemplate ="{node|short} ({phase}): {desc}\n"
 [phases]
 publish=False
+[experimental]
+verbose-obsolescence-exchange=true
 [extensions]
 hgext.strip=
 hgext.rebase=
--- a/tests/test-amend.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-amend.t	Fri Aug 08 23:14:00 2014 -0700
@@ -1,6 +1,4 @@
   $ cat >> $HGRCPATH <<EOF
-  > [defaults]
-  > amend=-d "0 0"
   > [extensions]
   > hgext.rebase=
   > hgext.graphlog=
@@ -17,12 +15,12 @@
   $ hg ci -Am adda
   adding a
 
-Test amend captures branches
+Test that amend captures branches
 
   $ hg branch foo
   marked working directory as branch foo
   (branches are permanent and global, did you want a bookmark?)
-  $ hg amend
+  $ hg amend -d '0 0'
   $ hg debugobsolete
   07f4944404050f47db2e5c5071e0e84e7a27bba9 6a022cbb61d5ba0f03f98ff2d36319dfea1034ae 0 {'date': '* *', 'user': 'test'} (glob)
   b2e32ffb533cbe1d5759638c0cd4e8abc43b2738 0 {'date': '* *', 'user': 'test'} (glob)
@@ -35,7 +33,7 @@
   
 Test no-op
 
-  $ hg amend
+  $ hg amend -d '0 0'
   nothing changed
   [1]
   $ glog
@@ -44,7 +42,7 @@
 
 Test forcing the message to the same value, no intermediate revision.
 
-  $ hg amend -m 'adda'
+  $ hg amend -d '0 0' -m 'adda'
   nothing changed
   [1]
   $ glog
@@ -80,4 +78,22 @@
   |
   o  2@foo(draft) adda
   
+Specify precise commit date with -d
+  $ hg amend -d '2001-02-03 04:05:06 +0700'
+  $ hg parents --template '{rev}  {date|date}\n'
+  5  Sat Feb 03 04:05:06 2001 +0700
 
+Specify "now" as commit date with -D
+  $ before=`date +%s`
+  $ hg amend -D
+  $ commit=`hg parents --template '{date|hgdate} rev{rev}\n'`
+  $ after=`date +%s`
+  $ (echo $before ; echo $commit; echo $after) | sort -k1 -n -s
+  \d+ (re)
+  \d+ 0 rev6 (re)
+  \d+ (re)
+
+Specify current user as committer with -U
+  $ HGUSER=newbie hg amend -U
+  $ hg parents --template '{rev}  {author}\n'
+  7  newbie
--- a/tests/test-corrupt.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-corrupt.t	Fri Aug 08 23:14:00 2014 -0700
@@ -111,10 +111,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 2 changes to 2 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 4 nodes
-  OBSEXC: pushing 2 markers (147 bytes)
-  OBSEXC: DONE
+  pushing 2 obsolescence markers (147 bytes)
   $ hg -R ../other verify
   checking changesets
   checking manifests
--- a/tests/test-evolve.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-evolve.t	Fri Aug 08 23:14:00 2014 -0700
@@ -341,6 +341,27 @@
   $ hg commit --amend -m 'dansk!'
   2 new unstable changesets
 
+(ninja test for the {trouble} template:
+
+  $ hg log -G --template '{rev} {troubles}\n'
+  @  13
+  |
+  | o  11 unstable
+  | |
+  | o  10 unstable
+  | |
+  | x  9
+  |/
+  o  7
+  |
+  o  6
+  |
+  o  0
+  
+
+
+(/ninja)
+
   $ hg evolve --all --traceback
   move:[10] dansk 2!
   atop:[13] dansk!
@@ -385,9 +406,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
+  pull obsolescence markers
   $ cd alpha
 
   $ cat << EOF > A
@@ -444,10 +463,8 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (171 bytes)
-  OBSEXC: 2 markers added
-  OBSEXC: DONE
+  pull obsolescence markers
+  2 obsolescence markers added
   (run 'hg update' to get a working copy)
   $ hg up
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -593,26 +610,35 @@
 
   $ rm *.orig
   $ hg fold
-  no revision to fold
+  abort: no revisions specified
+  [255]
+  $ hg fold .
+  single revision specified, nothing to fold
   [1]
-  $ hg fold 6 --rev 10
-  abort: cannot specify both --rev and a target revision
+  $ hg fold 0::10 --rev 1 --exact
+  abort: cannot fold non-linear revisions (multiple heads given)
+  [255]
+  $ hg fold -r 4 -r 6 --exact
+  abort: cannot fold non-linear revisions (multiple roots given)
   [255]
-  $ hg fold 6 # want to run hg fold 6
-  2 changesets folded
+  $ hg fold 10 1
+  abort: cannot fold non-linear revisions
+  (given revisions are unrelated to parent of working directory)
+  [255]
+  $ hg phase --public 0
+  $ hg fold -r 0
+  abort: cannot fold public revisions
+  [255]
+  $ hg fold -r 5
+  3 changesets folded
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ glog
-  @  11:dd4682c1a481@default(draft) add 1
-  |
-  o  5:0b9e50c35132@default(draft) add 3
-  |
-  o  4:ce341209337f@default(draft) add 4
-  |
-  | o  1:73d38bb17fd7@default(draft) add 1
-  |/
-  o  0:8685c6d34325@default(draft) add 0
+  $ hg fold 6 # want to run hg fold 6
+  abort: unknown revision '6'!
+  [255]
+  $ hg log -r 11 --template '{desc}\n'
+  add 3
   
-  $ hg log -r 11 --template '{desc}\n'
+  
   add 1
   
   
@@ -624,15 +650,15 @@
 
   $ hg up 4
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ hg fold --rev 4::11 --user victor
-  3 changesets folded
+  $ hg fold --rev 4::11 --user victor --exact
+  2 changesets folded
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ glog
   @  12:d26d339c513f@default(draft) add 4
   |
   | o  1:73d38bb17fd7@default(draft) add 1
   |/
-  o  0:8685c6d34325@default(draft) add 0
+  o  0:8685c6d34325@default(public) add 0
   
   $ hg log --template '{rev}: {author}\n'
   12: victor
@@ -656,8 +682,7 @@
 
   $ hg olog
   4	: add 4 - test
-  5	: add 3 - test
-  11	: add 1 - test
+  11	: add 3 - test
 
 Test obsstore stat
 
--- a/tests/test-exchange-A1.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-A1.t	Fri Aug 08 23:14:00 2014 -0700
@@ -54,8 +54,8 @@
   $ cp -r A.1.1 A.1.1.b
 
 
-Variante a: push -r A
----------------------
+Variant a: push -r A
+--------------------
 
   $ dotest A.1.1.a A
   ## Running testcase A.1.1.a
@@ -74,7 +74,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -91,7 +91,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
@@ -105,8 +105,8 @@
 
 
 
-Variante b: push
----------------------
+Variant b: push
+---------------
 
   $ dotest A.1.1.b
   ## Running testcase A.1.1.b
@@ -124,7 +124,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -141,7 +141,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
@@ -213,8 +213,8 @@
   $ cp -r A.1.2 A.1.2.b
 
 
-Variante a: push -r A
----------------------
+Variant a: push -r A
+--------------------
 
   $ dotest A.1.2.a B
   ## Running testcase A.1.2.a
@@ -233,7 +233,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -250,7 +250,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
@@ -261,8 +261,8 @@
   # obstore: pulldest
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {'date': '', 'user': 'test'}
 
-Variante b: push
----------------------
+Variant b: push
+---------------
 
   $ dotest A.1.2.b
   ## Running testcase A.1.2.b
@@ -280,7 +280,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -297,7 +297,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
--- a/tests/test-exchange-A2.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-A2.t	Fri Aug 08 23:14:00 2014 -0700
@@ -82,7 +82,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -100,7 +100,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
--- a/tests/test-exchange-A3.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-A3.t	Fri Aug 08 23:14:00 2014 -0700
@@ -73,8 +73,8 @@
   $ cd ..
   $ cd ..
 
-Actual Test for first version (changeset unknown remotly)
----------------------------------------------------------
+Actual Test for first version (changeset unknown in remote)
+-----------------------------------------------------------
 
   $ dotest A.3.a A1
   ## Running testcase A.3.a
@@ -94,7 +94,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -112,7 +112,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
@@ -125,8 +125,8 @@
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {'date': '', 'user': 'test'}
 
 
-other variant: changeset know remotly
--------------------------------------------
+other variant: changeset known in remote
+----------------------------------------
 
   $ setuprepos A.3.b
   creating test repo for test case A.3.b
@@ -164,8 +164,8 @@
   $ cd ..
   $ cd ..
 
-Actual Test for first version (changeset unknown remotly)
----------------------------------------------------------
+Actual Test for first version (changeset unknown in remote)
+-----------------------------------------------------------
 
 check it complains about multiple heads
 
@@ -198,7 +198,7 @@
   added 1 changesets with 1 changes to 1 files (+1 heads)
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -216,7 +216,7 @@
   added 1 changesets with 1 changes to 2 files (+1 heads)
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg heads' to see heads, 'hg merge' to merge)
   1 new unstable changesets
--- a/tests/test-exchange-A4.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-A4.t	Fri Aug 08 23:14:00 2014 -0700
@@ -66,8 +66,8 @@
   $ cd ..
   $ cd ..
 
-Actual Test for first version (changeset unknown remotly)
----------------------------------------------------------
+Actual Test for first version (changeset unknown in remote)
+-----------------------------------------------------------
 
   $ dotest A.4 B -f
   ## Running testcase A.4
@@ -87,7 +87,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -105,7 +105,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
--- a/tests/test-exchange-A5.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-A5.t	Fri Aug 08 23:14:00 2014 -0700
@@ -94,7 +94,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -113,7 +113,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
--- a/tests/test-exchange-A6.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-A6.t	Fri Aug 08 23:14:00 2014 -0700
@@ -42,7 +42,7 @@
   $ mkcommit A1
   created new head
 
-make both changeset known remotly
+make both changeset known in remote
 
   $ hg push -qf ../pushdest
   $ hg push -qf ../pulldest
@@ -82,7 +82,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -95,7 +95,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
@@ -106,7 +106,7 @@
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {'date': '', 'user': 'test'}
 
 Actual Test (bare push version)
------------------------------------
+-------------------------------
 
   $ dotest A.6.b
   ## Running testcase A.6.b
@@ -121,7 +121,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 markers (62 bytes)
+  OBSEXC: pushing 1 obsolescence markers (62 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -135,7 +135,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (62 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-B1.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-B1.t	Fri Aug 08 23:14:00 2014 -0700
@@ -3,7 +3,7 @@
 
   $ . $TESTDIR/_exc-util.sh
 
-=== B.1 Prune on non targeted common changeset ===
+=== B.1 Prune on non-targeted common changeset ===
 
 .. {{{
 ..     ⊗ B
@@ -53,7 +53,7 @@
   $ cp -r B.1 B.1.a
   $ cp -r B.1 B.1.b
 
-Actual Test (explicite push version)
+Actual Test (explicit push version)
 -----------------------------------
 
   $ dotest B.1.a A
@@ -73,7 +73,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers (89 bytes)
+  OBSEXC: pushing 1 obsolescence markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -90,7 +90,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
@@ -120,7 +120,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 markers (89 bytes)
+  OBSEXC: pushing 1 obsolescence markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -137,7 +137,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
--- a/tests/test-exchange-B2.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-B2.t	Fri Aug 08 23:14:00 2014 -0700
@@ -3,7 +3,7 @@
 
   $ . $TESTDIR/_exc-util.sh
 
-=== B.2 Pruned changeset on head. nothing pushed ===
+=== B.2 Pruned changeset on head: nothing pushed ===
 
 .. {{{
 ..     ⊗ A
@@ -48,7 +48,7 @@
   $ cp -r B.2 B.2.a
   $ cp -r B.2 B.2.b
 
-Actual Test (explicite push version)
+Actual Test (explicit push version)
 -----------------------------------
 
   $ dotest B.2.a O
@@ -65,7 +65,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 1 markers (89 bytes)
+  OBSEXC: pushing 1 obsolescence markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -78,7 +78,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
@@ -104,7 +104,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 1 markers (89 bytes)
+  OBSEXC: pushing 1 obsolescence markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -118,7 +118,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-B4.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-B4.t	Fri Aug 08 23:14:00 2014 -0700
@@ -74,7 +74,7 @@
   $ cp -r B.4 B.4.a
   $ cp -r B.4 B.4.b
 
-Actual Test (explicite push version)
+Actual Test (explicit push version)
 -----------------------------------
 
   $ dotest B.4.a O
@@ -91,7 +91,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 1 markers (89 bytes)
+  OBSEXC: pushing 1 obsolescence markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -104,7 +104,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
@@ -130,7 +130,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 markers (89 bytes)
+  OBSEXC: pushing 1 obsolescence markers (89 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -144,7 +144,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 markers added
+  OBSEXC: 1 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-B5.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-B5.t	Fri Aug 08 23:14:00 2014 -0700
@@ -72,8 +72,8 @@
   $ cp -r B.5 B.5.a
   $ cp -r B.5 B.5.b
 
-Actual Test (explicite push version)
--------------------------------------
+Actual Test (explicit push version)
+-----------------------------------
 
   $ dotest B.5.a B -f
   ## Running testcase B.5.a
@@ -93,7 +93,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 2 markers (150 bytes)
+  OBSEXC: pushing 2 obsolescence markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -112,7 +112,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (150 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   1 new unstable changesets
@@ -148,7 +148,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 2 markers (150 bytes)
+  OBSEXC: pushing 2 obsolescence markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -167,7 +167,7 @@
   added 2 changesets with 2 changes to 2 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (150 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   1 new unstable changesets
--- a/tests/test-exchange-B6.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-B6.t	Fri Aug 08 23:14:00 2014 -0700
@@ -77,7 +77,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers (150 bytes)
+  OBSEXC: pushing 2 obsolescence markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -92,7 +92,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (150 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-B7.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-B7.t	Fri Aug 08 23:14:00 2014 -0700
@@ -4,7 +4,7 @@
   $ . $TESTDIR/_exc-util.sh
 
 
-=== B.7 Prune on non targeted common changeset ===
+=== B.7 Prune on non-targeted common changeset ===
 ..
 .. {{{
 ..     ⊗ B
--- a/tests/test-exchange-C1.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-C1.t	Fri Aug 08 23:14:00 2014 -0700
@@ -54,8 +54,8 @@
   $ cp -r C.1 C.1.a
   $ cp -r C.1 C.1.b
 
-Actual Test (explicite push)
--------------------------------------
+Actual Test (explicit push)
+---------------------------
 
   $ dotest C.1.a O
   ## Running testcase C.1.a
@@ -72,7 +72,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers (177 bytes)
+  OBSEXC: pushing 2 obsolescence markers (177 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -87,7 +87,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (177 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
@@ -117,7 +117,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers (177 bytes)
+  OBSEXC: pushing 2 obsolescence markers (177 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -133,7 +133,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (177 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-C2.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-C2.t	Fri Aug 08 23:14:00 2014 -0700
@@ -61,8 +61,8 @@
   $ cp -r C.2 C.2.a
   $ cp -r C.2 C.2.b
 
-Actual Test (explicite push)
--------------------------------------
+Actual Test (explicit push)
+---------------------------
 
   $ dotest C.2.a A1
   ## Running testcase C.2.a
@@ -82,7 +82,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 markers (150 bytes)
+  OBSEXC: pushing 2 obsolescence markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -101,7 +101,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (150 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
@@ -135,7 +135,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 markers (150 bytes)
+  OBSEXC: pushing 2 obsolescence markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -154,7 +154,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (150 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
--- a/tests/test-exchange-C3.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-C3.t	Fri Aug 08 23:14:00 2014 -0700
@@ -66,8 +66,8 @@
   $ cp -r C.3 C.3.a
   $ cp -r C.3 C.3.b
 
-Actual Test (explicite push)
--------------------------------------
+Actual Test (explicit push)
+---------------------------
 
   $ dotest C.3.a O
   ## Running testcase C.3.a
@@ -85,7 +85,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 3 markers (238 bytes)
+  OBSEXC: pushing 3 obsolescence markers (238 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -102,7 +102,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (238 bytes)
-  OBSEXC: 3 markers added
+  OBSEXC: 3 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
@@ -136,7 +136,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 3 markers (238 bytes)
+  OBSEXC: pushing 3 obsolescence markers (238 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -154,7 +154,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (238 bytes)
-  OBSEXC: 3 markers added
+  OBSEXC: 3 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-C4.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-C4.t	Fri Aug 08 23:14:00 2014 -0700
@@ -92,7 +92,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers (150 bytes)
+  OBSEXC: pushing 2 obsolescence markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -108,7 +108,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (150 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-D1.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-D1.t	Fri Aug 08 23:14:00 2014 -0700
@@ -3,7 +3,7 @@
 
   $ . $TESTDIR/_exc-util.sh
 
-=== D.1 Pruned changeset based on a missing precursors of something we miss ===
+=== D.1 Pruned changeset based on missing precursor of something not present ===
 
 .. {{{
 ..   B ⊗
@@ -76,7 +76,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 markers (150 bytes)
+  OBSEXC: pushing 2 obsolescence markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -95,7 +95,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (150 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
--- a/tests/test-exchange-D2.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-D2.t	Fri Aug 08 23:14:00 2014 -0700
@@ -69,7 +69,7 @@
   no changes found
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers (150 bytes)
+  OBSEXC: pushing 2 obsolescence markers (150 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -85,7 +85,7 @@
   no changes found
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (150 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-D4.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-exchange-D4.t	Fri Aug 08 23:14:00 2014 -0700
@@ -68,8 +68,8 @@
   $ cd ..
   $ cd ..
 
-Actual Test for first version (changeset unknown remotly)
----------------------------------------------------------
+Actual Test for first version (changeset unknown in remote)
+-----------------------------------------------------------
 
   $ dotest A.3.a A1
   ## Running testcase A.3.a
@@ -91,7 +91,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: computing relevant nodes
   OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 markers (123 bytes)
+  OBSEXC: pushing 2 obsolescence markers (123 bytes)
   OBSEXC: DONE
   ## post push state
   # obstore: main
@@ -112,7 +112,7 @@
   added 1 changesets with 1 changes to 1 files
   OBSEXC: pull obsolescence markers
   OBSEXC: merging obsolescence markers (123 bytes)
-  OBSEXC: 2 markers added
+  OBSEXC: 2 obsolescence markers added
   OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
--- a/tests/test-import.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-import.t	Fri Aug 08 23:14:00 2014 -0700
@@ -1,6 +1,6 @@
 
 This feature requires mercurial 3.0
-(and the `only(` revset is 3.0 specific)
+(and the `only()` revset is 3.0 specific)
 
   $ (hg help revset | grep '"only(' > /dev/null) || exit 80
 
--- a/tests/test-obsolete.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-obsolete.t	Fri Aug 08 23:14:00 2014 -0700
@@ -65,7 +65,7 @@
   2
   - 4538525df7e2
 
-Test that obsolete parent a properly computed
+Test that obsolete precursors are properly computed
 
   $ qlog -r 'precursors(.)' --hidden
   2
@@ -85,13 +85,13 @@
   @@ -0,0 +1,1 @@
   +obsol_c
 
-Test that obsolete successors a properly computed
+Test that obsolete successors are properly computed
 
   $ qlog -r 'successors(2)' --hidden
   3
   - 0d3f46688ccc
 
-test obsolete changeset with no-obsolete descendant
+test obsolete changeset with non-obsolete descendant
   $ hg up 1 -q
   $ mkcommit "obsol_c'" # 4 (on 1)
   created new head
@@ -181,10 +181,7 @@
   adding manifests
   adding file changes
   added 5 changesets with 5 changes to 5 files (+1 heads)
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 2 markers (123 bytes)
-  OBSEXC: DONE
+  pushing 2 obsolescence markers (123 bytes)
   $ hg -R ../other-new verify
   checking changesets
   checking manifests
@@ -238,10 +235,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 3 markers (184 bytes)
-  OBSEXC: DONE
+  pushing 3 obsolescence markers (184 bytes)
   $ qlog -R ../other-new
   5
   - 95de7fc6918d
@@ -257,16 +251,13 @@
   2
   - 0d3f46688ccc
 
-Pushing again does not advertise extinct changeset
+Pushing again does not advertise extinct changesets
 
   $ hg push ../other-new
   pushing to ../other-new
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 3 markers (184 bytes)
-  OBSEXC: DONE
+  pushing 3 obsolescence markers (184 bytes)
   [1]
 
   $ hg up --hidden -q .^ # 3
@@ -282,10 +273,8 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (245 bytes)
-  OBSEXC: 1 markers added
-  OBSEXC: DONE
+  pull obsolescence markers
+  1 obsolescence markers added
   (run 'hg heads' to see heads, 'hg merge' to merge)
   $ qlog -R ../other-new
   6
@@ -299,9 +288,9 @@
   0
   - 1f0dee641bb7
 
-pushing to stuff that doesn't support obsolete
+pushing to stuff that doesn't support obsolescence
 
-DISABLED. the _enable switch it global :-/
+DISABLED. the _enable switch is global :-/
 
 ..  $ hg init ../other-old
 ..  > # XXX I don't like this but changeset get published otherwise
@@ -375,10 +364,8 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (306 bytes)
-  OBSEXC: 1 markers added
-  OBSEXC: DONE
+  pull obsolescence markers
+  1 obsolescence markers added
   (run 'hg heads' to see heads, 'hg merge' to merge)
 
   $ hg up -q 7 # to check rollback update behavior
@@ -464,7 +451,7 @@
   0
   - 1f0dee641bb7
 
-Check that auto update ignore hidden changeset
+Check that auto update ignores hidden changeset
   $ hg up 0
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg up 
@@ -472,7 +459,7 @@
   $ hg id -n
   8
 
-Check that named update do too
+Check that named update does too
 
   $ hg update default
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -495,33 +482,36 @@
   o  0 - 1f0dee641bb7 add a
   
 
-  $ hg log -G  --template='{rev} - {node|short}\n' --hidden
-  x  9 - 83b5778897ad
+  $ hg log -G  --template='{rev} - {node|short} {desc}\n' --hidden
+  x  9 - 83b5778897ad add toto
   
-  o  8 - 159dfc9fa5d3
+  o  8 - 159dfc9fa5d3 add obsol_d''
   |
-  | x  7 - 909a0fb57e5d
+  | x  7 - 909a0fb57e5d add obsol_d'
   |/
-  | x  6 - 95de7fc6918d
+  | x  6 - 95de7fc6918d add obsol_d
   |/
-  | x  5 - a7a6f2b5d8a5
+  | x  5 - a7a6f2b5d8a5 add d
   |/
-  | o  4 - 725c380fe99b
+  | o  4 - 725c380fe99b add obsol_c'
   | |
-  x |  3 - 0d3f46688ccc
+  x |  3 - 0d3f46688ccc add obsol_c
   |/
-  | x  2 - 4538525df7e2
+  | x  2 - 4538525df7e2 add c
   |/
-  o  1 - 7c3bad9141dc
+  o  1 - 7c3bad9141dc add b
   |
-  o  0 - 1f0dee641bb7
+  o  0 - 1f0dee641bb7 add a
   
 
-should not rebase extinct changeset
+should not rebase extinct changesets
 
 #excluded 'whole rebase set is extinct and ignored.' message not in core
   $ hg rebase -b '3' -d 4 --traceback
   2 new divergent changesets
+  $ hg --hidden log -q -r 'successors(3)'
+  4:725c380fe99b
+  10:2033b4e49474
   $ hg up tip
   ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
   $ hg log -G --template='{rev} - {node|short} {desc}\n'
@@ -537,7 +527,7 @@
   
 
 Does not complain about new head if you obsolete the old one
-(re necesarry when we start runnind discovery on unfiltered repo in core)
+(re necessary when we start running discovery on unfiltered repo in core)
 
   $ hg push ../other-new --traceback
   pushing to ../other-new
@@ -546,10 +536,7 @@
   adding manifests
   adding file changes
   added 2 changesets with 1 changes to [12] files (re)
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 7 markers (452 bytes)
-  OBSEXC: DONE
+  pushing 7 obsolescence markers (452 bytes)
   $ hg up -q 10
   $ mkcommit "obsol_d'''"
   created new head
@@ -561,10 +548,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 8 markers (513 bytes)
-  OBSEXC: DONE
+  pushing 8 obsolescence markers (513 bytes)
   $ cd ..
 
 check bumped detection
--- a/tests/test-prune.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-prune.t	Fri Aug 08 23:14:00 2014 -0700
@@ -46,7 +46,7 @@
   $ hg debugobsolete
   9d206ffc875e1bc304590549be293be36821e66c 0 {'date': '314064000 0', ('p1': '47d2a3944de8b013de3be9578e8e344ea2e6c097', )?'user': 'blah'} (re)
 
-prune leaving unstability behind
+prune leaving instability behind
 
   $ hg prune 1
   1 changesets pruned
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-sharing.t	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,311 @@
+Test script based on sharing.rst: ensure that all scenarios in that
+document work as advertised.
+
+Setting things up
+
+  $ cat >> $HGRCPATH <<EOF
+  > [alias]
+  > shortlog = log --template '{rev}:{node|short}  {phase}  {desc|firstline}\n'
+  > [extensions]
+  > rebase =
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+  $ hg init public
+  $ hg clone -q public test-repo
+  $ hg clone -q test-repo dev-repo
+  $ cat >> test-repo/.hg/hgrc <<EOF
+  > [phases]
+  > publish = false
+  > EOF
+
+To start things off, let's make one public, immutable changeset::
+
+  $ cd test-repo
+  $ echo 'my new project' > file1
+  $ hg add file1
+  $ hg commit -m'create new project'
+  $ hg push -q
+
+and pull that into the development repository::
+
+  $ cd ../dev-repo
+  $ hg pull -q -u
+
+Let's commit a preliminary change and push it to ``test-repo`` for
+testing. ::
+
+  $ echo 'fix fix fix' > file1
+  $ hg commit -m'prelim change'
+  $ hg push -q ../test-repo
+
+Figure SG01 (roughly)
+  $ hg shortlog -G
+  @  1:f6490818a721  draft  prelim change
+  |
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Now let's switch to test-repo to test our change and amend::
+  $ cd ../test-repo
+  $ hg update -q
+  $ echo 'Fix fix fix.' > file1
+  $ hg amend -m'fix bug 37'
+
+Figure SG02
+  $ hg shortlog --hidden -G
+  @  3:60ffde5765c5  draft  fix bug 37
+  |
+  | x  2:2a039763c0f4  draft  temporary amend commit for f6490818a721
+  | |
+  | x  1:f6490818a721  draft  prelim change
+  |/
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Pull into dev-repo: obsolescence markers are transferred, but not
+the new obsolete changeset.
+  $ cd ../dev-repo
+  $ hg pull -q -u
+
+Figure SG03
+  $ hg shortlog --hidden -G
+  @  2:60ffde5765c5  draft  fix bug 37
+  |
+  | x  1:f6490818a721  draft  prelim change
+  |/
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Amend again in dev-repo
+  $ echo 'Fix, fix, and fix.' > file1
+  $ hg amend
+  $ hg push -q
+
+Figure SG04 (dev-repo)
+  $ hg shortlog --hidden -G
+  @  4:de6151c48e1c  draft  fix bug 37
+  |
+  | x  3:ad19d3570adb  draft  temporary amend commit for 60ffde5765c5
+  | |
+  | x  2:60ffde5765c5  draft  fix bug 37
+  |/
+  | x  1:f6490818a721  draft  prelim change
+  |/
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Figure SG04 (test-repo)
+  $ cd ../test-repo
+  $ hg update -q
+  $ hg shortlog --hidden -G
+  @  4:de6151c48e1c  draft  fix bug 37
+  |
+  | x  3:60ffde5765c5  draft  fix bug 37
+  |/
+  | x  2:2a039763c0f4  draft  temporary amend commit for f6490818a721
+  | |
+  | x  1:f6490818a721  draft  prelim change
+  |/
+  o  0:0dc9c9f6ab91  public  create new project
+  
+This bug fix is finished. We can push it to the public repository.
+  $ hg push
+  pushing to $TESTTMP/public
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pushing 4 obsolescence markers (341 bytes)
+
+Figure SG05
+  $ hg -R ../public shortlog -G
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Oops, still have draft changesets in dev-repo.
+  $ cd ../dev-repo
+  $ hg shortlog -r 'draft()'
+  4:de6151c48e1c  draft  fix bug 37
+  $ hg pull -q -u
+  $ hg shortlog -r 'draft()'
+
+Sharing by Alice and Bob to demonstrate bumped and divergent changesets.
+First, setup repos for them.
+
+  $ cd ..
+  $ hg clone -q public alice
+  $ hg clone -q public bob
+  $ cat >> alice/.hg/hgrc <<EOF
+  > [phases]
+  > publish = false
+  > EOF
+  $ cp alice/.hg/hgrc bob/.hg/hgrc
+
+Alice commits a bug fix.
+  $ cd alice
+  $ echo 'fix' > file2
+  $ hg commit -q -A -u alice -m 'fix bug 15'
+
+Bob pulls and amends Alice's fix.
+  $ cd ../bob
+  $ hg pull -q -u ../alice
+  $ echo 'Fix.' > file2
+  $ hg amend -q -A -u bob -m 'fix bug 15 (amended)'
+
+Figure SG06: Bob's repository after amending Alice's fix.
+(Nothing new here; we could have seen this in the user guide.
+  $ hg --hidden shortlog -G
+  @  4:fe884dfac355  draft  fix bug 15 (amended)
+  |
+  | x  3:0376cac226f8  draft  temporary amend commit for e011baf925da
+  | |
+  | x  2:e011baf925da  draft  fix bug 15
+  |/
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+  o  0:0dc9c9f6ab91  public  create new project
+  
+
+But in the meantime, Alice decides the fix is just fine and publishes it.
+  $ cd ../alice
+  $ hg push -q
+
+Which means that Bob now has an formerly obsolete changeset that is
+also public (2:6e83). As soon as he pulls its phase change, he's got
+trouble: the successors of that formerly obsolete changeset are
+bumped.
+
+  $ cd ../bob
+  $ hg --hidden shortlog -r 'obsolete()'
+  2:e011baf925da  draft  fix bug 15
+  3:0376cac226f8  draft  temporary amend commit for e011baf925da
+  $ hg pull -q -u
+  1 new bumped changesets
+  $ hg --hidden shortlog -r 'obsolete()'
+  3:0376cac226f8  draft  temporary amend commit for e011baf925da
+  $ hg shortlog -r 'bumped()'
+  4:fe884dfac355  draft  fix bug 15 (amended)
+
+Figure SG07: Bob's repo with one bumped changeset (rev 4:c02d)
+  $ hg --hidden shortlog -G
+  @  4:fe884dfac355  draft  fix bug 15 (amended)
+  |
+  | x  3:0376cac226f8  draft  temporary amend commit for e011baf925da
+  | |
+  | o  2:e011baf925da  public  fix bug 15
+  |/
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+  o  0:0dc9c9f6ab91  public  create new project
+  
+
+Bob gets out of trouble by evolving the repository.
+  $ hg evolve --all
+  recreate:[4] fix bug 15 (amended)
+  atop:[2] fix bug 15
+  computing new diff
+  committed as 227d860d9ad0
+
+Figure SG08
+  $ hg --hidden shortlog -G
+  @  5:227d860d9ad0  draft  bumped update to e011baf925da:
+  |
+  | x  4:fe884dfac355  draft  fix bug 15 (amended)
+  | |
+  +---x  3:0376cac226f8  draft  temporary amend commit for e011baf925da
+  | |
+  o |  2:e011baf925da  public  fix bug 15
+  |/
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+  o  0:0dc9c9f6ab91  public  create new project
+  
+
+Throw away Bob's messy repo and start over.
+  $ cd ..
+  $ rm -rf bob
+  $ cp -rp alice bob
+
+Bob commits a pretty good fix that both he and Alice will amend,
+leading to divergence.
+  $ cd bob
+  $ echo 'pretty good fix' >> file1
+  $ hg commit -u bob -m 'fix bug 24 (v1)'
+
+Alice pulls Bob's fix and improves it.
+  $ cd ../alice
+  $ hg pull -q -u ../bob
+  $ echo 'better (alice)' >> file1
+  $ hg amend -u alice -m 'fix bug 24 (v2 by alice)'
+
+Likewise, Bob amends his own fix. Now we have an obsolete changeset
+with two successors, although the successors are in different repos.
+  $ cd ../bob
+  $ echo 'better (bob)' >> file1
+  $ hg amend -u bob -m 'fix bug 24 (v2 by bob)'
+
+Bob pulls from Alice's repo and discovers the trouble: divergent changesets!
+  $ hg pull -q -u ../alice
+  not updating: not a linear update
+  (merge or update --check to force update)
+  2 new divergent changesets
+  $ hg shortlog -r 'divergent()'
+  5:fc16901f4d7a  draft  fix bug 24 (v2 by bob)
+  6:694fd0f6b503  draft  fix bug 24 (v2 by alice)
+
+Figure SG09
+  $ hg --hidden shortlog -G
+  o  6:694fd0f6b503  draft  fix bug 24 (v2 by alice)
+  |
+  | @  5:fc16901f4d7a  draft  fix bug 24 (v2 by bob)
+  |/
+  | x  4:162612d3335b  draft  temporary amend commit for fe81d904ed08
+  | |
+  | x  3:fe81d904ed08  draft  fix bug 24 (v1)
+  |/
+  o  2:e011baf925da  public  fix bug 15
+  |
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Merge the trouble away.
+  $ hg merge --tool internal:local
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg commit -m merge
+  $ hg shortlog -G
+  @    7:b1d30ba26e44  draft  merge
+  |\
+  | o  6:694fd0f6b503  draft  fix bug 24 (v2 by alice)
+  | |
+  o |  5:fc16901f4d7a  draft  fix bug 24 (v2 by bob)
+  |/
+  o  2:e011baf925da  public  fix bug 15
+  |
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+  o  0:0dc9c9f6ab91  public  create new project
+  
+  $ hg log -q -r 'divergent()'
+  5:fc16901f4d7a
+  6:694fd0f6b503
+
+# XXX hg evolve does not solve this trouble! bug in evolve?
+#Evolve the trouble away.
+#  $ hg evolve --all --tool=internal:local
+#  merge:[5] fix bug 24 (v2 by bob)
+#  with: [6] fix bug 24 (v2 by alice)
+#  base: [3] fix bug 24 (v1)
+#  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+#  $ hg status
+#  $ hg shortlog -G
+#  o  6:694fd0f6b503  draft  fix bug 24 (v2 by alice)
+#  |
+#  | @  5:fc16901f4d7a  draft  fix bug 24 (v2 by bob)
+#  |/
+#  o  2:e011baf925da  public  fix bug 15
+#  |
+#  o  1:de6151c48e1c  public  fix bug 37
+#  |
+#  o  0:0dc9c9f6ab91  public  create new project
+#  
+#  $ hg --hidden shortlog -G
--- a/tests/test-simple4server.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-simple4server.t	Fri Aug 08 23:14:00 2014 -0700
@@ -50,10 +50,6 @@
   pulling from http://localhost:$HGPORT/
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: looking for common markers in 2 nodes
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
   $ hg pull -R ../other
   pulling from http://localhost:$HGPORT/
   requesting all changes
@@ -61,10 +57,7 @@
   adding manifests
   adding file changes
   added 2 changesets with 2 changes to 2 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: looking for common markers in 2 nodes
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
+  pull obsolescence markers
   (run 'hg update' to get a working copy)
   $ hg push -R ../other
   pushing to http://localhost:$HGPORT/
@@ -98,20 +91,11 @@
   remote: adding manifests
   remote: adding file changes
   remote: added 1 changesets with 1 changes to 1 files (+1 heads)
-  OBSEXC: computing relevant nodes
-  OBSEXC: looking for common markers in 2 nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers (171 bytes)
-  OBSEXC: DONE
+  pushing 2 obsolescence markers (171 bytes)
   $ hg push
   pushing to http://localhost:$HGPORT/
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: looking for common markers in [23] nodes (re)
-  OBSEXC: markers already in sync
-  OBSEXC: no marker to push
-  OBSEXC: DONE
   [1]
 
 Pull
@@ -124,20 +108,13 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
-  OBSEXC: pull obsolescence markers
-  OBSEXC: looking for common markers in [23] nodes (re)
-  OBSEXC: merging obsolescence markers (171 bytes)
-  OBSEXC: 2 markers added
-  OBSEXC: DONE
+  pull obsolescence markers
+  2 obsolescence markers added
   (run 'hg heads' to see heads)
   $ hg -R ../other pull
   pulling from http://localhost:$HGPORT/
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: looking for common markers in [23] nodes (re)
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
 
   $ cd ..
 
--- a/tests/test-stabilize-conflict.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-stabilize-conflict.t	Fri Aug 08 23:14:00 2014 -0700
@@ -1,6 +1,6 @@
-=================================================================
-This files test the proper behavior of evo during merge conflict.
-=================================================================
+=========================================================
+Test the proper behavior of evolve during merge conflict.
+=========================================================
 
 Initial setup
 
@@ -186,8 +186,8 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     babar count up to five
   
-proper behavior with conflict using an external merge tools
------------------------------------------------------------
+proper behavior with conflict using an external merge tool
+----------------------------------------------------------
 
   $ safesed 's/merge=.*/merge=touch/' $HGRCPATH
   $ safesed 's/touch.gui=.*/touch.gui=false/' $HGRCPATH
@@ -209,7 +209,7 @@
   $ hg amend
   1 new unstable changesets
   $ safesed 's/interactive=.*/interactive=true/' $HGRCPATH
-  $ HGMERGE=touch hg evolve <<EOF
+  $ hg evolve --tool touch <<EOF
   > n
   > EOF
   move:[8] babar count up to fifteen
--- a/tests/test-stabilize-order.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-stabilize-order.t	Fri Aug 08 23:14:00 2014 -0700
@@ -85,7 +85,7 @@
   o  0:c471ef929e6a@default(draft) addroot
   
 
-Test stabilizing a descendant predecessors child
+Test stabilizing a descendant predecessor's child
 
   $ hg up 7
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
--- a/tests/test-stabilize-result.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-stabilize-result.t	Fri Aug 08 23:14:00 2014 -0700
@@ -29,9 +29,10 @@
   $ echo a >> a
   $ hg amend -m changea
   1 new unstable changesets
-  $ hg evolve -v
+  $ hg evolve -v --confirm
   move:[2] changea
   atop:[4] changea
+  perform evolve? [Ny] y
   hg rebase -r cce2c55b8965 -d fb9d051ec0a4
   resolving manifests
   $ glog --hidden
@@ -99,10 +100,10 @@
   $ hg evolve --continue
   grafting revision 5
 
-Stabilize of late comer with different parent
-==================================================
+Stabilize latecomer with different parent
+=========================================
 
-(the same parent case is handled in test-evolve.t)
+(the same-parent case is handled in test-evolve.t)
 
   $ glog
   @  8:1cf0aacfd363@default(draft) bk:[] newer a
@@ -148,7 +149,7 @@
   o  0:07f494440405@default(public) bk:[] adda
   
 
-Stabilize !
+Stabilize!
 
   $ hg evolve --any --dry-run
   recreate:[12] newer a
@@ -157,9 +158,10 @@
   hg update 1cf0aacfd363;
   hg revert --all --rev (73b15c7566e9|d5c7ef82d003); (re)
   hg commit --msg "bumped update to %s" (no-eol)
-  $ hg evolve --any
+  $ hg evolve --any --confirm
   recreate:[12] newer a
   atop:[8] newer a
+  perform evolve? [Ny] y
   rebasing to destination parent: 66719795a494
   computing new diff
   committed as (a7cabd7bd9c2|671b9d7eeaec) (re)
@@ -175,8 +177,8 @@
   o  0:07f494440405@default(public) bk:[] adda
   
 
-Stabilize divergenent changesets with same parent
-=================================================
+Stabilize divergent changesets with same parent
+===============================================
 
   $ rm a.orig
   $ hg up 9
@@ -230,9 +232,13 @@
   o  0:07f494440405@default(public) bk:[] adda
   
 
-Stabilize It
+Stabilize it
 
-  $ hg evolve -qn --traceback
+  $ hg evolve -qn --traceback --confirm
+  merge:[19] More addition
+  with: [17] More addition
+  base: [15] More addition
+  perform evolve? [Ny] y
   hg update -c eacc9c8240fe &&
   hg merge d2f173e25686 &&
   hg commit -m "auto merge resolving conflict between eacc9c8240fe and d2f173e25686"&&
--- a/tests/test-tutorial.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-tutorial.t	Fri Aug 08 23:14:00 2014 -0700
@@ -224,9 +224,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
-  OBSEXC: pull obsolescence markers
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
+  pull obsolescence markers
   (run 'hg heads' to see heads, 'hg merge' to merge)
 
 I now have a new heads. Note that this remote head is immutable
@@ -405,10 +403,7 @@
   adding manifests
   adding file changes
   added 3 changesets with 3 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 5 nodes
-  OBSEXC: pushing 6 markers (487 bytes)
-  OBSEXC: DONE
+  pushing 6 obsolescence markers (487 bytes)
 
 for simplicity sake we get the bathroom change in line again
 
@@ -473,21 +468,24 @@
 The tutorial part is not written yet but can use `hg fold`:
 
   $ hg help fold
-  hg fold rev
+  hg fold [OPTION]... [-r] REV
   
   aliases: squash
   
-  Fold multiple revisions into a single one
+  fold multiple revisions into a single one
   
-      The revisions from your current working directory to the given one are
-      folded into a single successor revision.
+      Folds a set of revisions with the parent of the working directory. All
+      revisions linearly between the given revisions and the parent of the
+      working directory will also be folded.
   
-      you can alternatively use --rev to explicitly specify revisions to be
-      folded, ignoring the current working directory parent.
+      Use --exact for folding only the specified revisions while ignoring the
+      parent of the working directory. In this case, the given revisions must
+      form a linear unbroken chain.
   
   options:
   
-   -r --rev VALUE [+] explicitly specify the full set of revision to fold
+   -r --rev VALUE [+] revision to fold
+      --exact         only fold specified revisions
    -m --message TEXT  use text as commit message
    -l --logfile FILE  read commit message from file
    -d --date DATE     record the specified date as commit date
@@ -495,7 +493,7 @@
   
   [+] marked option can be specified multiple times
   
-  use "hg -v help fold" to show the global options
+  use "hg -v help fold" to show more complete help and the global options
 
 
 -----------------------
@@ -523,10 +521,8 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (560 bytes)
-  OBSEXC: 1 markers added
-  OBSEXC: DONE
+  pull obsolescence markers
+  1 obsolescence markers added
   (run 'hg update' to get a working copy)
   $ hg log -G
   o  75954b8cd933 (public): bathroom stuff
@@ -583,10 +579,8 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (560 bytes)
-  OBSEXC: 1 markers added
-  OBSEXC: DONE
+  pull obsolescence markers
+  1 obsolescence markers added
   (run 'hg update' to get a working copy)
   $ hg log -G
   o  75954b8cd933 (draft): bathroom stuff
@@ -646,10 +640,8 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (560 bytes)
-  OBSEXC: 0 markers added
-  OBSEXC: DONE
+  pull obsolescence markers
+  0 obsolescence markers added
   (run 'hg heads' to see heads, 'hg merge' to merge)
   1 new unstable changesets
 
@@ -738,10 +730,7 @@
   adding manifests
   adding file changes
   added 2 changesets with 2 changes to 1 files (+1 heads)
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 7 nodes
-  OBSEXC: pushing 10 markers (803 bytes)
-  OBSEXC: DONE
+  pushing 10 obsolescence markers (803 bytes)
 
 remote get a warning that current working directory is based on an obsolete changeset
 
@@ -750,10 +739,8 @@
   pulling from $TESTTMP/local
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (803 bytes)
-  OBSEXC: 0 markers added
-  OBSEXC: DONE
+  pull obsolescence markers
+  0 obsolescence markers added
   working directory parent is obsolete!
 
 now let's see where we are, and update to the successor
@@ -783,10 +770,8 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (803 bytes)
-  OBSEXC: 0 markers added
-  OBSEXC: DONE
+  pull obsolescence markers
+  0 obsolescence markers added
   (run 'hg update' to get a working copy)
   $ hg log -G
   o  99f039c5ec9e (draft): SPAM SPAM SPAM
--- a/tests/test-uncommit.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-uncommit.t	Fri Aug 08 23:14:00 2014 -0700
@@ -152,6 +152,7 @@
 
   $ hg uncommit
   abort: nothing to uncommit
+  (use --all to uncommit all files)
   [255]
   $ hg bookmarks
    * touncommit-bm             3:5eb72dbe0cb4
@@ -162,6 +163,7 @@
 
   $ hg uncommit --include nothere
   abort: nothing to uncommit
+  (use --all to uncommit all files)
   [255]
 
 Enjoy uncommit
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-userguide.t	Fri Aug 08 23:14:00 2014 -0700
@@ -0,0 +1,316 @@
+ensure that all the scenarios in the user guide work as documented
+
+basic repo
+  $ hg init t
+  $ cd t
+  $ touch file1.c file2.c
+  $ hg -q commit -A -m init
+
+example 1: commit creates a changeset in draft phase
+(this is nothing to do with evolve, but it's mentioned in the user guide)
+  $ echo 'feature Y' >> file1.c
+  $ hg commit -u alice -d '0 0' -m 'implement feature X'
+  $ hg phase -r .
+  1: draft
+  $ hg identify -in
+  6e725fd2be6f 1
+
+example 2: unsafe amend with plain vanilla Mercurial: the original
+commit is stripped
+  $ hg commit --amend -u alice -d '1 0' -m 'implement feature Y'
+  saved backup bundle to $TESTTMP/t/.hg/strip-backup/6e725fd2be6f-amend-backup.hg
+  $ hg log -r 23fe4ac6d3f1
+  abort: unknown revision '23fe4ac6d3f1'!
+  [255]
+  $ hg identify -in
+  fe0ecd3bd2a4 1
+
+enable evolve for safe history modification
+  $ cat >> $HGRCPATH <<EOF
+  > [alias]
+  > shortlog = log --template '{rev}:{node|short}  {phase}  {desc|firstline}\n'
+  > [extensions]
+  > rebase =
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+example 3: safe amend with "hg commit --amend" (figure 2)
+  $ echo 'tweak feature Y' >> file1.c
+  $ hg commit --amend -u alice -d '2 0' -m 'implement feature Y'
+  $ hg shortlog -q -r fe0ecd3bd2a4
+  abort: unknown revision 'fe0ecd3bd2a4'!
+  [255]
+  $ hg --hidden shortlog -G
+  @  3:934359450037  draft  implement feature Y
+  |
+  | x  2:6c5f78d5d467  draft  temporary amend commit for fe0ecd3bd2a4
+  | |
+  | x  1:fe0ecd3bd2a4  draft  implement feature Y
+  |/
+  o  0:08c4b6f4efc8  draft  init
+  
+example 3 redux: repeat safe amend, this time with "hg amend"
+  $ hg rollback -q
+  $ hg amend -u alice -d '2 0' -m 'implement feature Y'
+  $ hg --hidden shortlog -G
+  @  3:934359450037  draft  implement feature Y
+  |
+  | x  2:6c5f78d5d467  draft  temporary amend commit for fe0ecd3bd2a4
+  | |
+  | x  1:fe0ecd3bd2a4  draft  implement feature Y
+  |/
+  o  0:08c4b6f4efc8  draft  init
+  
+example 4: prune at head (figure 3)
+  $ echo 'debug hack' >> file1.c
+  $ hg commit -m 'debug hack'
+  $ hg prune .
+  1 changesets pruned
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory now at 934359450037
+  $ hg parents --template '{rev}:{node|short}  {desc|firstline}\n'
+  3:934359450037  implement feature Y
+  $ hg --hidden shortlog -G -r 3:
+  x  4:a3e0ef24aaf0  draft  debug hack
+  |
+  @  3:934359450037  draft  implement feature Y
+  |
+
+example 5: uncommit files at head (figure 4)
+  $ echo 'relevant' >> file1.c
+  $ echo 'irrelevant' >> file2.c
+  $ hg commit -u dan -d '10 0' -m 'fix bug 234'
+  $ hg uncommit file2.c
+  $ hg status
+  M file2.c
+  $ hg --hidden shortlog -G -r 'descendants(3) - 4'
+  @  6:c8defeecf7a4  draft  fix bug 234
+  |
+  | x  5:da4331967f5f  draft  fix bug 234
+  |/
+  o  3:934359450037  draft  implement feature Y
+  |
+  $ hg parents --template '{rev}:{node|short}  {desc|firstline}\n{files}\n'
+  6:c8defeecf7a4  fix bug 234
+  file1.c
+  $ hg revert --no-backup file2.c
+
+example 6: fold multiple changesets together into one (figure 5)
+  $ echo step1 >> file1.c
+  $ hg commit -m 'step 1'
+  $ echo step2 >> file1.c
+  $ hg commit -m 'step 2'
+  $ echo step3 >> file2.c
+  $ hg commit -m 'step 3'
+  $ hg log --template '{rev}:{node|short}  {desc|firstline}\n' -r 7::
+  7:05e61aab8294  step 1
+  8:be6d5bc8e4cc  step 2
+  9:35f432d9f7c1  step 3
+  $ hg fold -d '0 0' -m 'fix bug 64' -r 7::
+  3 changesets folded
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg --hidden shortlog -G -r 6::
+  @  10:171c6a79a27b  draft  fix bug 64
+  |
+  | x  9:35f432d9f7c1  draft  step 3
+  | |
+  | x  8:be6d5bc8e4cc  draft  step 2
+  | |
+  | x  7:05e61aab8294  draft  step 1
+  |/
+  o  6:c8defeecf7a4  draft  fix bug 234
+  |
+  $ hg --hidden log -q -r 'successors(7) | successors(8) | successors(9)'
+  10:171c6a79a27b
+  $ hg --hidden log -q -r 'precursors(10)'
+  7:05e61aab8294
+  8:be6d5bc8e4cc
+  9:35f432d9f7c1
+  $ hg diff -c 10 -U 0
+  diff -r c8defeecf7a4 -r 171c6a79a27b file1.c
+  --- a/file1.c	Thu Jan 01 00:00:10 1970 +0000
+  +++ b/file1.c	Thu Jan 01 00:00:00 1970 +0000
+  @@ -3,0 +4,2 @@
+  +step1
+  +step2
+  diff -r c8defeecf7a4 -r 171c6a79a27b file2.c
+  --- a/file2.c	Thu Jan 01 00:00:10 1970 +0000
+  +++ b/file2.c	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,1 @@
+  +step3
+
+setup for example 7: amend an older changeset
+  $ echo 'fix fix oops fix' > file2.c
+  $ hg commit -u bob -d '3 0' -m 'fix bug 17'
+  $ echo 'cleanup' >> file1.c
+  $ hg commit -u bob -d '4 0' -m 'cleanup'
+  $ echo 'new feature' >> file1.c
+  $ hg commit -u bob -d '5 0' -m 'feature 23'
+  $ hg --hidden shortlog -G -r 10::
+  @  13:dadcbba2d606  draft  feature 23
+  |
+  o  12:debd46bb29dc  draft  cleanup
+  |
+  o  11:3e1cb8f70c02  draft  fix bug 17
+  |
+  o  10:171c6a79a27b  draft  fix bug 64
+  |
+
+example 7: amend an older changeset (figures 6, 7)
+  $ hg update -q 11
+  $ echo 'fix fix fix fix' > file2.c
+  $ hg amend -u bob -d '6 0'
+  2 new unstable changesets
+  $ hg shortlog -r 'obsolete()'
+  11:3e1cb8f70c02  draft  fix bug 17
+  $ hg shortlog -r 'unstable()'
+  12:debd46bb29dc  draft  cleanup
+  13:dadcbba2d606  draft  feature 23
+  $ hg --hidden shortlog -G -r 10::
+  @  15:395cbeda3a06  draft  fix bug 17
+  |
+  | x  14:f7fab707e247  draft  temporary amend commit for 3e1cb8f70c02
+  | |
+  | | o  13:dadcbba2d606  draft  feature 23
+  | | |
+  | | o  12:debd46bb29dc  draft  cleanup
+  | |/
+  | x  11:3e1cb8f70c02  draft  fix bug 17
+  |/
+  o  10:171c6a79a27b  draft  fix bug 64
+  |
+  $ hg evolve -q --all
+  $ hg shortlog -G -r 10::
+  @  17:91b4b0f8b5c5  draft  feature 23
+  |
+  o  16:fe8858bd9bc2  draft  cleanup
+  |
+  o  15:395cbeda3a06  draft  fix bug 17
+  |
+  o  10:171c6a79a27b  draft  fix bug 64
+  |
+
+setup for example 8: prune an older changeset (figure 8)
+  $ echo 'useful' >> file1.c
+  $ hg commit -u carl -d '7 0' -m 'useful work'
+  $ echo 'debug' >> file2.c
+  $ hg commit -u carl -d '8 0' -m 'debug hack'
+  $ echo 'more useful' >> file1.c
+  $ hg commit -u carl -d '9 0' -m 'more work'
+  $ hg shortlog -G -r 17::
+  @  20:ea8fafca914b  draft  more work
+  |
+  o  19:b23d06b457a8  draft  debug hack
+  |
+  o  18:1f33e68b18b9  draft  useful work
+  |
+  o  17:91b4b0f8b5c5  draft  feature 23
+  |
+
+example 8: prune an older changeset (figures 8, 9)
+  $ hg prune 19
+  1 changesets pruned
+  1 new unstable changesets
+  $ hg --hidden shortlog -G -r 18::
+  @  20:ea8fafca914b  draft  more work
+  |
+  x  19:b23d06b457a8  draft  debug hack
+  |
+  o  18:1f33e68b18b9  draft  useful work
+  |
+  $ hg evolve -q --all
+  $ hg --hidden shortlog -G -r 18::
+  @  21:4393e5877437  draft  more work
+  |
+  | x  20:ea8fafca914b  draft  more work
+  | |
+  | x  19:b23d06b457a8  draft  debug hack
+  |/
+  o  18:1f33e68b18b9  draft  useful work
+  |
+
+example 9: uncommit files from an older changeset (discard changes)
+(figure 10)
+  $ echo 'this fixes bug 53' >> file1.c
+  $ echo 'debug hack' >> file2.c
+  $ hg commit -u dan -d '11 0' -m 'fix bug 53'
+  $ echo 'and this handles bug 67' >> file1.c
+  $ hg commit -u dan -d '12 0' -m 'fix bug 67'
+  $ hg update 22
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg shortlog -G -r 21::
+  o  23:4db2428c8ae3  draft  fix bug 67
+  |
+  @  22:f84357446753  draft  fix bug 53
+  |
+  o  21:4393e5877437  draft  more work
+  |
+  $ hg uncommit file2.c
+  1 new unstable changesets
+  $ hg status
+  M file2.c
+  $ hg revert file2.c
+  $ hg evolve --all
+  move:[23] fix bug 67
+  atop:[24] fix bug 53
+  $ hg --hidden shortlog -G -r 21::
+  @  25:0d972d6888e6  draft  fix bug 67
+  |
+  o  24:71bb83d674c5  draft  fix bug 53
+  |
+  | x  23:4db2428c8ae3  draft  fix bug 67
+  | |
+  | x  22:f84357446753  draft  fix bug 53
+  |/
+  o  21:4393e5877437  draft  more work
+  |
+  $ rm file2.c.orig
+
+example 10: uncommit files from an older changeset (keep changes)
+(figures 11, 12)
+  $ echo 'fix a bug' >> file1.c
+  $ echo 'useful but unrelated' >> file2.c
+  $ hg commit -u dan -d '11 0' -m 'fix a bug'
+  $ echo 'new feature' >> file1.c
+  $ hg commit -u dan -d '12 0' -m 'new feature'
+  $ hg update 26
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg --hidden shortlog -G -r 25::
+  o  27:fbb3c6d50427  draft  new feature
+  |
+  @  26:5b31a1239ab9  draft  fix a bug
+  |
+  o  25:0d972d6888e6  draft  fix bug 67
+  |
+  $ hg uncommit file2.c
+  1 new unstable changesets
+  $ hg status
+  M file2.c
+  $ hg commit -m 'useful tweak'
+  $ hg --hidden shortlog -G -r 25::
+  @  29:51e0d8c0a922  draft  useful tweak
+  |
+  o  28:2594e98553a9  draft  fix a bug
+  |
+  | o  27:fbb3c6d50427  draft  new feature
+  | |
+  | x  26:5b31a1239ab9  draft  fix a bug
+  |/
+  o  25:0d972d6888e6  draft  fix bug 67
+  |
+  $ hg evolve --all
+  move:[27] new feature
+  atop:[28] fix a bug
+  $ hg --hidden shortlog -G -r 25::
+  @  30:166c1c368ab6  draft  new feature
+  |
+  | o  29:51e0d8c0a922  draft  useful tweak
+  |/
+  o  28:2594e98553a9  draft  fix a bug
+  |
+  | x  27:fbb3c6d50427  draft  new feature
+  | |
+  | x  26:5b31a1239ab9  draft  fix a bug
+  |/
+  o  25:0d972d6888e6  draft  fix bug 67
+  |
--- a/tests/test-wireproto.t	Fri Aug 08 15:50:26 2014 -0700
+++ b/tests/test-wireproto.t	Fri Aug 08 23:14:00 2014 -0700
@@ -23,10 +23,6 @@
 
   $ hg clone ssh://user@dummy/server client
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: looking for common markers in 0 nodes
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
   updating to branch default
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ cp -r client other
@@ -48,10 +44,6 @@
   pulling from ssh://user@dummy/server
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: looking for common markers in 2 nodes
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
   $ hg pull -R ../other
   pulling from ssh://user@dummy/server
   requesting all changes
@@ -59,10 +51,7 @@
   adding manifests
   adding file changes
   added 2 changesets with 2 changes to 2 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: looking for common markers in 2 nodes
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
+  pull obsolescence markers
   (run 'hg update' to get a working copy)
   $ hg push -R ../other
   pushing to ssh://user@dummy/server
@@ -78,11 +67,7 @@
   $ hg push
   pushing to ssh://user@dummy/server
   searching for changes
-  OBSEXC: computing relevant nodes
-  OBSEXC: looking for common markers in 2 nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 markers (171 bytes)
-  OBSEXC: DONE
+  pushing 2 obsolescence markers (171 bytes)
   remote: adding changesets
   remote: adding manifests
   remote: adding file changes
@@ -91,11 +76,6 @@
   pushing to ssh://user@dummy/server
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: looking for common markers in [23] nodes (re)
-  OBSEXC: markers already in sync
-  OBSEXC: no marker to push
-  OBSEXC: DONE
   [1]
 
 Pull
@@ -108,20 +88,13 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
-  OBSEXC: pull obsolescence markers
-  OBSEXC: looking for common markers in [23] nodes (re)
-  OBSEXC: merging obsolescence markers (171 bytes)
-  OBSEXC: 2 markers added
-  OBSEXC: DONE
+  pull obsolescence markers
+  2 obsolescence markers added
   (run 'hg heads' to see heads)
   $ hg -R ../other pull
   pulling from ssh://user@dummy/server
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: looking for common markers in [23] nodes (re)
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
 
   $ cd ..