--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-shelve.t Thu Aug 29 09:22:13 2013 -0700
@@ -0,0 +1,420 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "shelve=" >> $HGRCPATH
+ $ echo "[defaults]" >> $HGRCPATH
+ $ echo "diff = --nodates --git" >> $HGRCPATH
+
+ $ hg init repo
+ $ cd repo
+ $ mkdir a b
+ $ echo a > a/a
+ $ echo b > b/b
+ $ echo c > c
+ $ echo d > d
+ $ echo x > x
+ $ hg addremove -q
+
+shelving in an empty repo should be possible
+
+ $ hg shelve
+ (empty repository)
+ shelved as default
+ 0 files updated, 0 files merged, 5 files removed, 0 files unresolved
+
+ $ hg unshelve
+ unshelving change 'default'
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 5 changes to 5 files
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg commit -q -m 'initial commit'
+
+ $ hg shelve
+ nothing changed
+ [1]
+
+create another commit
+
+ $ echo n > n
+ $ hg add n
+ $ hg commit n -m second
+
+shelve a change that we will delete later
+
+ $ echo a >> a/a
+ $ hg shelve
+ shelved from default (bb4fec6d): second
+ shelved as default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+set up some more complex changes to shelve
+
+ $ echo a >> a/a
+ $ hg mv b b.rename
+ moving b/b to b.rename/b (glob)
+ $ hg cp c c.copy
+ $ hg status -C
+ M a/a
+ A b.rename/b
+ b/b
+ A c.copy
+ c
+ R b/b
+
+prevent some foot-shooting
+
+ $ hg shelve -n foo/bar
+ abort: shelved change names may not contain slashes
+ [255]
+ $ hg shelve -n .baz
+ abort: shelved change names may not start with '.'
+ [255]
+
+the common case - no options or filenames
+
+ $ hg shelve
+ shelved from default (bb4fec6d): second
+ shelved as default-01
+ 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg status -C
+
+ensure that our shelved changes exist
+
+ $ hg shelve -l
+ default-01 [*] shelved from default (bb4fec6d): second (glob)
+ default [*] shelved from default (bb4fec6d): second (glob)
+
+ $ hg shelve -l -p default
+ default [*] shelved from default (bb4fec6d): second (glob)
+
+ diff --git a/a/a b/a/a
+ --- a/a/a
+ +++ b/a/a
+ @@ -1,1 +1,2 @@
+ a
+ +a
+
+delete our older shelved change
+
+ $ hg shelve -d default
+
+local edits should prevent a shelved change from applying
+
+ $ echo e>>a/a
+ $ hg unshelve
+ unshelving change 'default-01'
+ the following shelved files have been modified:
+ a/a
+ you must commit, revert, or shelve your changes before you can proceed
+ abort: cannot unshelve due to local changes
+
+ [255]
+
+ $ hg revert -C a/a
+
+apply it and make sure our state is as expected
+
+ $ hg unshelve
+ unshelving change 'default-01'
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 8 files
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg status -C
+ M a/a
+ A b.rename/b
+ b/b
+ A c.copy
+ c
+ R b/b
+ $ hg shelve -l
+
+ $ hg unshelve
+ abort: no shelved changes to apply!
+ [255]
+ $ hg unshelve foo
+ abort: shelved change 'foo' not found
+ [255]
+
+named shelves, specific filenames, and "commit messages" should all work
+
+ $ hg status -C
+ M a/a
+ A b.rename/b
+ b/b
+ A c.copy
+ c
+ R b/b
+ $ hg shelve -q -n wibble -m wat a
+
+expect "a" to no longer be present, but status otherwise unchanged
+
+ $ hg status -C
+ A b.rename/b
+ b/b
+ A c.copy
+ c
+ R b/b
+ $ hg shelve -l --stat
+ wibble [*] wat (glob)
+ a/a | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+and now "a/a" should reappear
+
+ $ hg unshelve -q wibble
+ $ hg status -C
+ M a/a
+ A b.rename/b
+ b/b
+ A c.copy
+ c
+ R b/b
+
+cause unshelving to result in a merge with 'a' conflicting
+
+ $ hg shelve -q
+ $ echo c>>a/a
+ $ hg commit -m second
+ $ hg tip --template '{files}\n'
+ a/a
+
+add an unrelated change that should be preserved
+
+ $ mkdir foo
+ $ echo foo > foo/foo
+ $ hg add foo/foo
+
+force a conflicted merge to occur
+
+ $ hg unshelve
+ unshelving change 'default'
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 8 files (+1 heads)
+ merging a/a
+ warning: conflicts during merge.
+ merging a/a incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 2 files updated, 0 files merged, 1 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
+ [1]
+
+ensure that we have a merge with unresolved conflicts
+
+ $ hg heads -q
+ 3:7ec047b69dc0
+ 2:ceefc37abe1e
+ $ hg parents -q
+ 2:ceefc37abe1e
+ 3:7ec047b69dc0
+ $ hg status
+ M a/a
+ M b.rename/b
+ M c.copy
+ A foo/foo
+ R b/b
+ ? a/a.orig
+ $ hg diff
+ diff --git a/a/a b/a/a
+ --- a/a/a
+ +++ b/a/a
+ @@ -1,2 +1,6 @@
+ a
+ +<<<<<<< local
+ c
+ +=======
+ +a
+ +>>>>>>> other
+ diff --git a/b.rename/b b/b.rename/b
+ --- /dev/null
+ +++ b/b.rename/b
+ @@ -0,0 +1,1 @@
+ +b
+ diff --git a/b/b b/b/b
+ deleted file mode 100644
+ --- a/b/b
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -b
+ diff --git a/c.copy b/c.copy
+ --- /dev/null
+ +++ b/c.copy
+ @@ -0,0 +1,1 @@
+ +c
+ diff --git a/foo/foo b/foo/foo
+ new file mode 100644
+ --- /dev/null
+ +++ b/foo/foo
+ @@ -0,0 +1,1 @@
+ +foo
+ $ hg resolve -l
+ U a/a
+
+ $ hg shelve
+ abort: unshelve already in progress
+ (use 'hg unshelve --continue' or 'hg unshelve --abort')
+ [255]
+
+abort the unshelve and be happy
+
+ $ hg status
+ M a/a
+ M b.rename/b
+ M c.copy
+ A foo/foo
+ R b/b
+ ? a/a.orig
+ $ hg unshelve -a
+ unshelve of 'default' aborted
+ $ hg heads -q
+ 2:ceefc37abe1e
+ $ hg parents
+ changeset: 2:ceefc37abe1e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: second
+
+ $ hg resolve -l
+ $ hg status
+ A foo/foo
+ ? a/a.orig
+
+try to continue with no unshelve underway
+
+ $ hg unshelve -c
+ abort: no unshelve operation underway
+ [255]
+ $ hg status
+ A foo/foo
+ ? a/a.orig
+
+redo the unshelve to get a conflict
+
+ $ hg unshelve -q
+ warning: conflicts during merge.
+ merging a/a incomplete! (edit conflicts, then use 'hg resolve --mark')
+ unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
+ [1]
+
+attempt to continue
+
+ $ hg unshelve -c
+ abort: unresolved conflicts, can't continue
+ (see 'hg resolve', then 'hg unshelve --continue')
+ [255]
+
+ $ hg revert -r . a/a
+ $ hg resolve -m a/a
+
+ $ hg unshelve -c
+ unshelve of 'default' complete
+
+ensure the repo is as we hope
+
+ $ hg parents
+ changeset: 2:ceefc37abe1e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: second
+
+ $ hg heads -q
+ 2:ceefc37abe1e
+
+ $ hg status -C
+ M a/a
+ M b.rename/b
+ b/b
+ M c.copy
+ c
+ A foo/foo
+ R b/b
+ ? a/a.orig
+
+there should be no shelves left
+
+ $ hg shelve -l
+
+ $ hg commit -m whee a/a
+
+#if execbit
+
+ensure that metadata-only changes are shelved
+
+ $ chmod +x a/a
+ $ hg shelve -q -n execbit a/a
+ $ hg status a/a
+ $ hg unshelve -q execbit
+ $ hg status a/a
+ M a/a
+ $ hg revert a/a
+
+#endif
+
+#if symlink
+
+ $ rm a/a
+ $ ln -s foo a/a
+ $ hg shelve -q -n symlink a/a
+ $ hg status a/a
+ $ hg unshelve -q symlink
+ $ hg status a/a
+ M a/a
+ $ hg revert a/a
+
+#endif
+
+set up another conflict between a commit and a shelved change
+
+ $ hg revert -q -C -a
+ $ echo a >> a/a
+ $ hg shelve -q
+ $ echo x >> a/a
+ $ hg ci -m 'create conflict'
+ $ hg add foo/foo
+
+if we resolve a conflict while unshelving, the unshelve should succeed
+
+ $ HGMERGE=true hg unshelve
+ unshelving change 'default'
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 6 files (+1 heads)
+ merging a/a
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ $ hg parents -q
+ 4:be7e79683c99
+ $ hg shelve -l
+ $ hg status
+ M a/a
+ A foo/foo
+ $ cat a/a
+ a
+ c
+ x
+
+test keep and cleanup
+
+ $ hg shelve
+ shelved from default (be7e7968): create conflict
+ shelved as default
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg shelve --list
+ default [*] shelved from default (be7e7968): create conflict (glob)
+ $ hg unshelve --keep
+ unshelving change 'default'
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 7 files
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg shelve --list
+ default [*] shelved from default (be7e7968): create conflict (glob)
+ $ hg shelve --cleanup
+ $ hg shelve --list