cmdstate: introduce a "saver" contextmanager and use it in place of save()
Previously, the state was only saved in some paths out of these functions. This
can be problematic, if the user ctrl-c's (or `kill -9`'s) the process, or we
exit out of `relocate` for anything besides the "expected" reason, we won't
record that we were in the middle of an evolve.
One of our users has discovered that this leaves hg in a weird state; the user
did something like this:
```
$ hg evolve
<something goes wrong with the merge tool, hits ctrl-c>
<deals with the merge conflicts>
$ hg evolve --continue
abort: no interrupted evolve to continue
$ hg evolve
abort: uncommitted changes
# Note: commands.status.verbose=True is set.
$ hg status
M foo
# The repository is in an unfinished *update* state.
# No unresolved merge conflicts
# To continue: hg update
```
The user did an `hg update`, but it didn't actually do anything besides take it
out of the unfinished update state (the files were still dirty in the working
directory).
=============================
Training supports
=============================
Contributing
============
The main source for the supports is the `slides.md` but it doesn't contains
all the source.
The `slides.md` file contains several snippets that are replaced by other
files at compilation time.
For example:
.. code:: markdown
~~~raw-file
output/fix-a-bug-base.log
~~~
Will replace this three lines by the content of the file `output/fix-a-bug-
base.log` which is generated when running the .t test file (see below for
instruction how to do that).
.. code:: markdown
~~~graphviz-file
graphs/fix-bug-1.dot
~~~
Will replace this three lines by the svg rendering of the graphviz definition
in the file `graphs/fix-bug-1.dot`. This file is generated when running the .t
test file (see below for instruction how to do that).
Environment preparation
=======================
This training supports needs pandoc to compile.
You'll need a copy of the Mercurial source in order to generate the training
supports.
You will also needs a functioning Python environment with the possibility to
use `pip install` with your current user. In doubt, you can use a `virtualenv
<https://virtualenv.pypa.io/en/stable/>`.
You can then run the `prepare.sh` script that will configure the environment
for you.
Generating the supports
=======================
First, you need to run a .t test file to generate a bunch of files. You can
run the test file with this command:
`python /PATH/TO/MERCURIAL/tests/run-tests.py -l test-training.t`
It should have generated files in at least two directories: `graphs` and
`output`.
Finally, launch the `compile.sh` to generate the `index.html` output file.