Mercurial > evolve
diff tests/test-evolve-interrupted.t @ 4848:535ab2609e45
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).
author | Kyle Lippincott <spectral@google.com> |
---|---|
date | Mon, 16 Sep 2019 12:44:38 -0700 |
parents | |
children | 31c481934138 591a0afd2ef3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-evolve-interrupted.t Mon Sep 16 12:44:38 2019 -0700 @@ -0,0 +1,149 @@ +Quitting an evolve in the middle (via ctrl-c or something) can leave things in a +weird intermediate state where hg thinks we're in the middle of an update +operation (or even just leave the 'merge' directory around without actually +indicating we're in the middle of *any* operation). + + $ . $TESTDIR/testlib/common.sh + + $ cat << EOF >> $HGRCPATH + > [extensions] + > rebase = + > evolve = + > [alias] + > l = log -G -T'{rev} {desc}' + > EOF + + $ hg init interrupted-orphan + $ cd interrupted-orphan + + $ echo apricot > a + $ hg ci -qAm apricot + + $ echo banana > b + $ hg ci -qAm banana + +Let's go back to amend 0 and make an orphan out of 1 (and a merge conflict to +test with) + + $ hg up -q 0 + $ echo blueberry > b + $ hg l + o 1 banana + | + @ 0 apricot + + $ hg ci --amend -qAm 'apricot and blueberry' + 1 new orphan changesets + $ hg l + @ 2 apricot and blueberry + + * 1 banana + | + x 0 apricot + + + $ hg evolve --update --config hooks.precommit=false --config ui.merge=:other + move:[1] banana + atop:[2] apricot and blueberry + transaction abort! + rollback completed + abort: precommit hook exited with status 1 + [255] + $ hg l + @ 2 apricot and blueberry + + * 1 banana + | + x 0 apricot + + $ cat b + banana + + $ hg status --config commands.status.verbose=True + M b + # The repository is in an unfinished *evolve* state. + + # No unresolved merge conflicts. + + # To continue: hg evolve --continue + # To abort: hg evolve --abort + # To stop: hg evolve --stop + # (also see `hg help evolve.interrupted`) + + + $ ls .hg/evolvestate + .hg/evolvestate + + $ cat b + banana + + $ hg l + @ 2 apricot and blueberry + + * 1 banana + | + x 0 apricot + + +Test various methods of handling that unfinished state + $ hg evolve --abort + evolve aborted + working directory is now at e1989e4b1526 + $ ls .hg/evolvestate + ls: cannot access '?.hg/evolvestate'?: No such file or directory (re) + [2] + $ cat b + blueberry + $ hg l + @ 2 apricot and blueberry + + * 1 banana + | + x 0 apricot + + + $ hg evolve --update --config hooks.precommit=false --config ui.merge=:other + move:[1] banana + atop:[2] apricot and blueberry + transaction abort! + rollback completed + abort: precommit hook exited with status 1 + [255] + $ cat b + banana + $ hg evolve --stop + stopped the interrupted evolve + working directory is now at e1989e4b1526 + $ cat .hg/evolvestate + cat: .hg/evolvestate: No such file or directory + [1] + $ cat b + blueberry + $ hg l + @ 2 apricot and blueberry + + * 1 banana + | + x 0 apricot + + + $ hg evolve --update --config hooks.precommit=false --config ui.merge=:other + move:[1] banana + atop:[2] apricot and blueberry + transaction abort! + rollback completed + abort: precommit hook exited with status 1 + [255] + $ hg evolve --continue + evolving 1:e0486f65907d "banana" + working directory is now at bd5ec7dfc2af + $ cat .hg/evolvestate + cat: .hg/evolvestate: No such file or directory + [1] + $ cat b + banana + $ hg l + @ 3 banana + | + o 2 apricot and blueberry +