Mercurial > evolve
changeset 1048:a585353a816b stable
merge default into stable
Release 4.1.0 is coming
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Fri, 08 Aug 2014 23:14:00 -0700 |
parents | acc2b590edd9 (current diff) d830377bf186 (diff) |
children | 4d5d101e878f |
files | |
diffstat | 55 files changed, 9819 insertions(+), 827 deletions(-) [+] |
line wrap: on
line diff
--- 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 ..