sapling/tests/test-obsshelve.t
Jun Wu 3d461ae600 check-ext: make checks stricter
Summary:
Enhance check-ext script to be more strict:

 - Only one foreign extension is allowed: `remotenames`
 - Require explicit path for in-repo extensions to avoid wrong extensions
   being tested

This would make the test more predicatable since system extensions
will be less likely to be imported. Explicit path is better than
setting `PYTHONPATH` since `hgext/name.py` could override
`hgext3rd/name.py` regardless of `PYTHONPATH`.

Test Plan: arc unit

Reviewers: phillco, durham, ikostia, #mercurial, stash

Reviewed By: stash

Subscribers: medson, mjpieters

Differential Revision: https://phabricator.intern.facebook.com/D5271430

Signature: t1:5271430:1497861776:7dd35ec7c522cd9b26aa0871cb4306b4f1b8993a
2017-06-19 08:02:38 -07:00

1600 lines
39 KiB
Perl

$ PYTHONPATH=$TESTDIR/..:$PYTHONPATH
$ export PYTHONPATH
$ cat <<EOF >> $HGRCPATH
> [extensions]
> mq =
> obsshelve=$TESTDIR/../hgext3rd/obsshelve.py
> [defaults]
> diff = --nodates --git
> qnew = --date '0 0'
> [shelve]
> maxbackups = 2
> [experimental]
> evolution=createmarkers
> EOF
Make sure obs-based shelve can be used with an empty repo
$ cd $TESTTMP
$ hg init obsrepo
$ cd obsrepo
$ cat <<EOF >> .hg/hgrc
> [experimental]
> obsshelve=True
> EOF
$ mkdir a b
$ echo a > a/a
$ echo b > b/b
$ echo c > c
$ echo d > d
$ echo x > x
$ hg addremove -q
$ hg shelve
shelved as default
0 files updated, 0 files merged, 5 files removed, 0 files unresolved
$ hg shelve --list
default (*s ago) (changes in empty repository) (glob)
$ hg revert --all
$ hg unshelve
unshelving change 'default'
$ hg diff
diff --git a/a/a b/a/a
new file mode 100644
--- /dev/null
+++ b/a/a
@@ -0,0 +1,1 @@
+a
diff --git a/b/b b/b/b
new file mode 100644
--- /dev/null
+++ b/b/b
@@ -0,0 +1,1 @@
+b
diff --git a/c b/c
new file mode 100644
--- /dev/null
+++ b/c
@@ -0,0 +1,1 @@
+c
diff --git a/d b/d
new file mode 100644
--- /dev/null
+++ b/d
@@ -0,0 +1,1 @@
+d
diff --git a/x b/x
new file mode 100644
--- /dev/null
+++ b/x
@@ -0,0 +1,1 @@
+x
$ hg ci -qm "initial commit"
$ hg shelve
nothing changed
[1]
Make sure shelve files were backed up
$ ls .hg/shelve-backup
default.oshelve
default.patch
Create an mq patch - shelving should work fine with a patch applied
$ echo n > n
$ hg add n
$ hg commit n -m second
$ hg qnew second.patch
Shelve a change that we will delete later
$ echo a >> a/a
$ hg shelve
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
The common case - no options or filenames
$ hg shelve
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 (*)* changes to: [mq]: second.patch (glob)
default (*)* changes to: [mq]: second.patch (glob)
$ hg shelve -l -p default
default (*)* changes to: [mq]: second.patch (glob)
diff --git a/a/a b/a/a
--- a/a/a
+++ b/a/a
@@ -1,1 +1,2 @@
a
+a
$ hg shelve --list --addremove
abort: options '--list' and '--addremove' may not be used together
[255]
Delete our older shelved change
$ hg shelve -d default
$ hg qfinish -a -q
Ensure shelve backups aren't overwritten
$ ls .hg/shelve-backup/
default-1.oshelve
default-1.patch
default.oshelve
default.patch
Local edits should not prevent a shelved change from applying
$ printf "z\na\n" > a/a
$ hg unshelve --keep
unshelving change 'default-01'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing 5:32c69314e062 "changes to: [mq]: second.patch"
merging a/a
$ hg revert --all -q
$ rm a/a.orig b.rename/b c.copy
Apply it and make sure our state is as expected
(this also tests that same timestamp prevents backups from being
removed, even though there are more than 'maxbackups' backups)
$ f -t .hg/shelve-backup/default.patch
.hg/shelve-backup/default.patch: file
$ touch -t 200001010000 .hg/shelve-backup/default.patch
$ f -t .hg/shelve-backup/default-1.patch
.hg/shelve-backup/default-1.patch: file
$ touch -t 200001010000 .hg/shelve-backup/default-1.patch
$ hg unshelve
unshelving change 'default-01'
$ hg status -C
M a/a
A b.rename/b
b/b
A c.copy
c
R b/b
$ hg shelve -l
(both of default.oshelve and default-1.oshelve should be still kept,
because it is difficult to decide actual order of them from same timestamp)
$ ls .hg/shelve-backup/
default-01.oshelve
default-01.patch
default-1.oshelve
default-1.patch
default.oshelve
default.patch
$ 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
(this tests also that editor is invoked, if '--edit' is specified)
$ hg status -C
M a/a
A b.rename/b
b/b
A c.copy
c
R b/b
$ HGEDITOR=cat hg shelve -q -n wibble -m wat -e a
wat
HG: Enter commit message. Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: shelve@localhost
HG: branch 'default'
HG: changed a/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
$ cd a
$ hg unshelve -q wibble
$ cd ..
$ hg status -C
M a/a
A b.rename/b
b/b
A c.copy
c
R b/b
Ensure old shelve backups are being deleted automatically
$ ls .hg/shelve-backup/
default-01.oshelve
default-01.patch
wibble.oshelve
wibble.patch
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'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing 5:32c69314e062 "changes to: [mq]: second.patch"
merging a/a
warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
[1]
Ensure that we have a merge with unresolved conflicts
$ hg heads -q --template '{rev}\n'
12
5
$ hg parents -q --template '{rev}\n'
12
5
$ hg status
M a/a
M b.rename/b
M c.copy
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
+<<<<<<< dest: * - shelve: pending changes temporary commit (glob)
c
+=======
+a
+>>>>>>> source: 32c69314e062 - shelve: changes to: [mq]: second.patch
diff --git a/b/b b/b.rename/b
rename from b/b
rename to b.rename/b
diff --git a/c b/c.copy
copy from c
copy to c.copy
$ 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
R b/b
? a/a.orig
$ hg unshelve -a
rebase aborted
unshelve of 'default' aborted
$ hg heads -q
11:2e69b451d1ea
$ hg parents | grep changeset
changeset: 11:2e69b451d1ea
$ hg resolve -l
$ hg status
A foo/foo
? a/a.orig
Try to continue with no unshelve underway
$ hg unshelve -c
abort: no unshelve in progress
[255]
$ hg status
A foo/foo
? a/a.orig
Redo the unshelve to get a conflict
$ hg unshelve -q
warning: conflicts while merging a/a! (edit, 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
(no more unresolved files)
continue: hg unshelve --continue
$ hg commit -m 'commit while unshelve in progress'
abort: unshelve already in progress
(use 'hg unshelve --continue' or 'hg unshelve --abort')
[255]
$ hg graft --continue
abort: no graft in progress
(continue: hg unshelve --continue)
[255]
$ hg unshelve -c --trace
rebasing 5:32c69314e062 "changes to: [mq]: second.patch"
unshelve of 'default' complete
Ensure the repo is as we hope
$ hg parents | grep changeset
changeset: 11:2e69b451d1ea
$ hg heads -q
11:2e69b451d1ea
$ hg status -C
A b.rename/b
b/b
A c.copy
c
A foo/foo
R b/b
? a/a.orig
There should be no shelves left
$ hg shelve -l
#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
Ensure symlinks are properly handled
$ 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
$ rm a/a.orig b.rename/b c.copy
$ 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
$ hg unshelve --tool :merge-other --keep
unshelving change 'default'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing .* "changes to: second" (re)
merging a/a
$ hg shelve -l
default (*)* changes to: second (glob)
$ hg status
M a/a
A foo/foo
$ cat a/a
a
c
a
$ cat > a/a << EOF
> a
> c
> x
> EOF
$ sleep 1
$ HGMERGE=true hg unshelve
unshelving change 'default'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing .* "changes to: second" (re)
merging a/a
note: rebase of .* created no changes to commit (re)
$ hg shelve -l
$ hg status
A foo/foo
$ cat a/a
a
c
x
Test keep and cleanup
$ hg shelve
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg shelve --list
default (*)* changes to: create conflict (glob)
$ hg unshelve -k
unshelving change 'default'
$ hg shelve --list
default (*)* changes to: create conflict (glob)
$ hg shelve --cleanup
$ hg shelve --list
Test bookmarks
$ hg bookmark test
$ hg bookmark
\* test * (glob)
$ hg shelve
shelved as test
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg bookmark
\* test * (glob)
$ hg unshelve
unshelving change 'test'
$ hg bookmark
\* test * (glob)
Shelve should still work even if mq is disabled
$ hg --config extensions.mq=! shelve
shelved as test
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg --config extensions.mq=! shelve --list
test (*)* changes to: create conflict (glob)
$ hg bookmark
* test * (glob)
$ hg --config extensions.mq=! unshelve
unshelving change 'test'
$ hg bookmark
* test * (glob)
$ cd ..
Shelve should leave dirstate clean (issue4055)
$ hg init obsshelverebase
$ cd obsshelverebase
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ printf 'x\ny\n' > x
$ echo z > z
$ hg commit -Aqm xy
$ echo z >> x
$ hg commit -Aqm z
$ hg up 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ printf 'a\nx\ny\nz\n' > x
$ hg commit -Aqm xyz
$ echo c >> z
$ hg shelve
shelved as default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg rebase -d 1 --config extensions.rebase=
rebasing 2:323bfa07f744 "xyz" (tip)
merging x
$ hg unshelve
unshelving change 'default'
rebasing shelved changes
rebasing 3:82a0d7d6ba61 "changes to: xyz"
$ hg status
M z
$ cd ..
Shelve should only unshelve pending changes (issue4068)
$ hg init obssh-onlypendingchanges
$ cd obssh-onlypendingchanges
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ touch a
$ hg ci -Aqm a
$ touch b
$ hg ci -Aqm b
$ hg up -q 0
$ touch c
$ hg ci -Aqm c
$ touch d
$ hg add d
$ hg shelve
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg up -q 1
$ hg unshelve
unshelving change 'default'
rebasing shelved changes
rebasing 3:958bcbd1776e "changes to: c" (tip)
$ hg status
A d
Unshelve should work on an ancestor of the original commit
$ hg shelve
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg up 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg unshelve
unshelving change 'default'
rebasing shelved changes
rebasing 5:013284d9655e "changes to: b" (tip)
$ hg status
A d
Test bug 4073 we need to enable obsolete markers for it
$ hg shelve
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg debugobsolete `hg --debug id -i -r 1`
$ hg unshelve
unshelving change 'default'
Unshelve should leave unknown files alone (issue4113)
$ echo e > e
$ hg shelve
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg status
? e
$ hg unshelve
unshelving change 'default'
$ hg status
A d
? e
$ cat e
e
139. Unshelve should keep a copy of unknown files
$ hg add e
$ hg shelve
shelved as default
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ echo z > e
$ hg unshelve
unshelving change 'default'
$ cat e
e
$ cat e.orig
z
140. Unshelve and conflicts with tracked and untracked files
preparing:
$ rm *.orig
$ hg ci -qm 'commit stuff'
$ hg phase -p null:
no other changes - no merge:
$ echo f > f
$ hg add f
$ hg shelve
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo g > f
$ hg unshelve
unshelving change 'default'
$ hg st
A f
? f.orig
$ cat f
f
$ cat f.orig
g
other uncommitted changes - merge:
$ hg st
A f
? f.orig
$ hg shelve
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg log -G --template '{rev} {desc|firstline} {author}'
@ 9 commit stuff test
|
| o 2 c test
|/
o 0 a test
$ mv f.orig f
$ echo 1 > a
$ hg unshelve --date '1073741824 0'
unshelving change 'default'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing 10:81152db69da7 "changes to: commit stuff"
merging f
warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
[1]
$ hg parents -T "{desc|firstline}\n" | sort
changes to: commit stuff
pending changes temporary commit
$ hg st
M f
? f.orig
$ cat f
<<<<<<< dest: 5f6b880e719b - shelve: pending changes temporary commit
g
=======
f
>>>>>>> source: 81152db69da7 - shelve: changes to: commit stuff
$ cat f.orig
g
$ hg unshelve --abort -t false
tool option will be ignored
rebase aborted
unshelve of 'default' aborted
$ hg st
M a
? f.orig
$ cat f.orig
g
$ hg unshelve
unshelving change 'default'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing 10:81152db69da7 "changes to: commit stuff"
$ hg st
M a
A f
? f.orig
other committed changes - merge:
$ hg shelve f
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg ci a -m 'intermediate other change'
$ mv f.orig f
$ hg unshelve
unshelving change 'default'
rebasing shelved changes
rebasing 10:81152db69da7 "changes to: commit stuff"
merging f
warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
[1]
$ hg st
M f
? f.orig
$ cat f
<<<<<<< dest: * - test: intermediate other change (glob)
g
=======
f
>>>>>>> source: 81152db69da7 - shelve: changes to: commit stuff
$ cat f.orig
g
$ hg unshelve --abort
rebase aborted
unshelve of 'default' aborted
$ hg st
? f.orig
$ cat f.orig
g
$ hg shelve --delete default
Recreate some conflict again
$ cd ../obsrepo
$ hg up -C -r 'test^'
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(leaving bookmark test)
$ echo y >> a/a
$ hg shelve
shelved as default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg up test
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(activating bookmark test)
$ hg bookmark
* test * (glob)
$ hg unshelve
unshelving change 'default'
rebasing shelved changes
rebasing * "changes to: second" (tip) (glob)
merging a/a
warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
[1]
$ hg bookmark
test * (glob)
Test that resolving all conflicts in one direction (so that the rebase
is a no-op), works (issue4398)
$ hg revert -a -r .
reverting a/a (glob)
$ hg resolve -m a/a
(no more unresolved files)
continue: hg unshelve --continue
$ hg unshelve -c
rebasing * "changes to: second" (tip) (glob)
note: rebase of * created no changes to commit (glob)
unshelve of 'default' complete
$ hg bookmark
* test * (glob)
$ hg diff
$ hg status
? a/a.orig
? foo/foo
$ hg summary | egrep "(bookmarks|commit)"
bookmarks: *test
commit: 2 unknown (clean)
$ hg shelve --delete --stat
abort: options '--delete' and '--stat' may not be used together
[255]
$ hg shelve --delete --name NAME
abort: options '--delete' and '--name' may not be used together
[255]
Test interactive shelve
$ cat <<EOF >> $HGRCPATH
> [ui]
> interactive = true
> EOF
$ echo 'a' >> a/b
$ cat a/a >> a/b
$ echo 'x' >> a/b
$ mv a/b a/a
$ echo 'a' >> foo/foo
$ hg st
M a/a
? a/a.orig
? foo/foo
$ cat a/a
a
a
c
x
x
$ cat foo/foo
foo
a
$ hg shelve --interactive --config ui.interactive=false
abort: running non-interactively
[255]
$ hg shelve --interactive << EOF
> y
> y
> n
> EOF
diff --git a/a/a b/a/a
2 hunks, 2 lines changed
examine changes to 'a/a'? [Ynesfdaq?] y
@@ -1,3 +1,4 @@
+a
a
c
x
record change 1/2 to 'a/a'? [Ynesfdaq?] y
@@ -1,3 +2,4 @@
a
c
x
+x
record change 2/2 to 'a/a'? [Ynesfdaq?] n
shelved as test
merging a/a
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
$ cat a/a
a
c
x
x
$ cat foo/foo
foo
a
$ hg st
M a/a
? foo/foo
$ hg bookmark
* test * (glob)
$ hg log -r . -T "{desc|firstline}\n"
create conflict
$ hg unshelve
unshelving change 'test'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing * "changes to: create conflict" (glob)
merging a/a
$ hg bookmark
* test * (glob)
$ hg log -r . -T "{desc|firstline}\n"
create conflict
$ cat a/a
a
a
c
x
x
Shelve --patch and shelve --stat should work with a single valid shelfname
$ hg up --clean .
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(leaving bookmark test)
$ hg shelve --list
$ echo 'patch a' > shelf-patch-a
$ hg add shelf-patch-a
$ hg shelve
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo 'patch b' > shelf-patch-b
$ hg add shelf-patch-b
$ hg shelve
shelved as default-01
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg shelve --patch default default-01
default-01 (*s ago) changes to: create conflict (glob)
diff --git a/shelf-patch-b b/shelf-patch-b
new file mode 100644
--- /dev/null
+++ b/shelf-patch-b
@@ -0,0 +1,1 @@
+patch b
default (*s ago) changes to: create conflict (glob)
diff --git a/shelf-patch-a b/shelf-patch-a
new file mode 100644
--- /dev/null
+++ b/shelf-patch-a
@@ -0,0 +1,1 @@
+patch a
$ hg shelve --stat default default-01
default-01 (*s ago) changes to: create conflict (glob)
shelf-patch-b | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
default (*s ago) changes to: create conflict (glob)
shelf-patch-a | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
$ hg shelve --patch default
default (*)* changes to: create conflict (glob)
diff --git a/shelf-patch-a b/shelf-patch-a
new file mode 100644
--- /dev/null
+++ b/shelf-patch-a
@@ -0,0 +1,1 @@
+patch a
$ hg shelve --stat default
default (*)* changes to: create conflict (glob)
shelf-patch-a | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
$ hg shelve --patch nonexistentshelf
abort: cannot find shelf nonexistentshelf
[255]
$ hg shelve --stat nonexistentshelf
abort: cannot find shelf nonexistentshelf
[255]
Test visibility of in-memory changes inside transaction to external hook
------------------------------------------------------------------------
$ echo xxxx >> x
$ hg commit -m "changes to invoke rebase"
$ hg bookmark unshelvedest
$ cat > $TESTTMP/checkvisibility.sh <<EOF
> echo "==== \$1:"
> hg parents --template "VISIBLE {node|short}\n"
> # test that pending changes are hidden
> unset HG_PENDING
> hg parents --template "ACTUAL {node|short}\n"
> echo "===="
> EOF
$ cat >> .hg/hgrc <<EOF
> [defaults]
> # to fix hash id of temporary revisions
> unshelve = --date '0 0'
> EOF
"hg unshelve"implies steps below:
(1) commit changes in the working directory
(2) note shelved revision
(3) rebase: merge shelved revision into temporary wc changes
(4) rebase: commit merged revision
(5) rebase: update to a new commit
(6) update to original working copy parent
== test visibility to external preupdate hook
$ cat >> .hg/hgrc <<EOF
> [hooks]
> preupdate.visibility = sh $TESTTMP/checkvisibility.sh preupdate
> EOF
$ echo nnnn >> n
$ sh $TESTTMP/checkvisibility.sh before-unshelving
==== before-unshelving:
VISIBLE f77bf047d4c5
ACTUAL f77bf047d4c5
====
$ hg unshelve --keep default
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing *206bf5d4f922 "changes to: create conflict" (glob)
==== preupdate:
VISIBLE (?!f77bf047d4c5).* (re)
ACTUAL f77bf047d4c5
====
==== preupdate:
VISIBLE (?!f77bf047d4c5).* (re)
ACTUAL f77bf047d4c5
====
==== preupdate:
VISIBLE (?!f77bf047d4c5).* (re)
ACTUAL f77bf047d4c5
====
$ cat >> .hg/hgrc <<EOF
> [hooks]
> preupdate.visibility =
> EOF
$ sh $TESTTMP/checkvisibility.sh after-unshelving
==== after-unshelving:
VISIBLE f77bf047d4c5
ACTUAL f77bf047d4c5
====
== test visibility to external update hook
$ hg update -q -C unshelvedest
$ cat >> .hg/hgrc <<EOF
> [hooks]
> update.visibility = sh $TESTTMP/checkvisibility.sh update
> EOF
$ echo nnnn >> n
$ sh $TESTTMP/checkvisibility.sh before-unshelving
==== before-unshelving:
VISIBLE f77bf047d4c5
ACTUAL f77bf047d4c5
====
$ hg unshelve --keep default
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing *:206bf5d4f922 "changes to: create conflict" (glob)
==== update:
VISIBLE f3a8cb815d40
VISIBLE 206bf5d4f922
ACTUAL f77bf047d4c5
====
==== update:
VISIBLE f3a8cb815d40
ACTUAL f77bf047d4c5
====
==== update:
VISIBLE f77bf047d4c5
ACTUAL f77bf047d4c5
====
$ cat >> .hg/hgrc <<EOF
> [hooks]
> update.visibility =
> EOF
$ sh $TESTTMP/checkvisibility.sh after-unshelving
==== after-unshelving:
VISIBLE f77bf047d4c5
ACTUAL f77bf047d4c5
====
$ hg bookmark -d unshelvedest
$ cd ..
Test .orig files go where the user wants them to
---------------------------------------------------------------
$ hg init obssh-salvage
$ cd obssh-salvage
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ echo 'content' > root
$ hg commit -A -m 'root' -q
$ echo '' > root
$ hg shelve -q
$ echo 'contADDent' > root
$ hg unshelve -q --config 'ui.origbackuppath=.hg/origbackups'
warning: conflicts while merging root! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
[1]
$ ls .hg/origbackups
root.orig
$ rm -rf .hg/origbackups
Test Abort unshelve always gets user out of the unshelved state
---------------------------------------------------------------
Wreak havoc on the unshelve process
$ rm .hg/unshelverebasestate
$ hg unshelve --abort
unshelve of 'default' aborted
abort: (No such file or directory|The system cannot find the file specified) (re)
[255]
Can the user leave the current state?
$ hg up -C .
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
Try again but with a corrupted shelve state file
$ hg up -r 0 -q
$ echo '' > root
$ hg shelve -q
$ echo 'contADDent' > root
$ hg unshelve -q
warning: conflicts while merging root! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
[1]
$ sed 's/ae8c668541e8/123456789012/' .hg/shelvedstate > ../corrupt-shelvedstate
$ mv ../corrupt-shelvedstate .hg/histedit-state
$ hg unshelve --abort 2>&1 | grep 'rebase aborted'
rebase aborted
$ hg up -C .
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd ..
Keep active bookmark while (un)shelving even on shared repo (issue4940)
-----------------------------------------------------------------------
$ cat <<EOF >> $HGRCPATH
> [extensions]
> share =
> [experimnetal]
> evolution=createmarkers
> EOF
$ hg bookmarks -R obsrepo
test *:33f7f61e6c5e (glob)
$ hg share -B obsrepo obsshare
updating working directory
6 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd obsshare
$ hg bookmarks
test *:33f7f61e6c5e (glob)
$ hg bookmarks foo
$ hg bookmarks
\* foo *:f77bf047d4c5 (glob)
test *:33f7f61e6c5e (glob)
$ echo x >> x
$ hg shelve
shelved as foo
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg bookmarks
\* foo *:f77bf047d4c5 (glob)
test *:33f7f61e6c5e (glob)
$ hg unshelve
unshelving change 'foo'
$ hg bookmarks
\* foo *:f77bf047d4c5 (glob)
test *:33f7f61e6c5e (glob)
$ cd ..
Shelve and unshelve unknown files. For the purposes of unshelve, a shelved
unknown file is the same as a shelved added file, except that it will be in
unknown state after unshelve if and only if it was either absent or unknown
before the unshelve operation.
$ hg init obssh-unknowns
$ cd obssh-unknowns
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
The simplest case is if I simply have an unknown file that I shelve and unshelve
$ echo unknown > unknown
$ hg status
? unknown
$ hg shelve --unknown
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg status
$ hg unshelve
unshelving change 'default'
$ hg status
? unknown
$ rm unknown
If I shelve, add the file, and unshelve, does it stay added?
$ echo unknown > unknown
$ hg shelve -u
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg status
$ touch unknown
$ hg add unknown
$ hg status
A unknown
$ hg unshelve
unshelving change 'default'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing 0:098df96e7410 "(changes in empty repository)"
merging unknown
$ hg status
A unknown
$ hg forget unknown
$ rm unknown
And if I shelve, commit, then unshelve, does it become modified?
$ echo unknown > unknown
$ hg shelve -u
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg status
$ touch unknown
$ hg add unknown
$ hg commit -qm "Add unknown"
$ hg status
$ hg unshelve
unshelving change 'default'
rebasing shelved changes
rebasing 0:098df96e7410 "(changes in empty repository)"
merging unknown
$ hg status
M unknown
$ hg remove --force unknown
$ hg commit -qm "Remove unknown"
$ cd ..
We expects that non-bare shelve keeps newly created branch in
working directory.
$ hg init obs-shelve-preserve-new-branch
$ cd obs-shelve-preserve-new-branch
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ echo "a" >> a
$ hg add a
$ echo "b" >> b
$ hg add b
$ hg commit -m "ab"
$ echo "aa" >> a
$ echo "bb" >> b
$ hg branch new-branch
marked working directory as branch new-branch
(branches are permanent and global, did you want a bookmark?)
$ hg status
M a
M b
$ hg branch
new-branch
$ hg shelve a
shelved as default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch
new-branch
$ hg status
M b
$ touch "c" >> c
$ hg add c
$ hg status
M b
A c
$ hg shelve --exclude c
shelved as default-01
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch
new-branch
$ hg status
A c
$ hg shelve --include c
shelved as default-02
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg branch
new-branch
$ hg status
$ echo "d" >> d
$ hg add d
$ hg status
A d
We expect that bare-shelve will not keep branch in current working directory.
$ hg shelve
shelved as default-03
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg branch
default
$ cd ..
When i shelve commit on newly created branch i expect
that after unshelve newly created branch will be preserved.
$ hg init obs-shelve_on_new_branch_simple
$ cd obs-shelve_on_new_branch_simple
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ echo "aaa" >> a
$ hg commit -A -m "a"
adding a
$ hg branch
default
$ hg branch test
marked working directory as branch test
(branches are permanent and global, did you want a bookmark?)
$ echo "bbb" >> a
$ hg status
M a
$ hg shelve
shelved as default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch
default
$ echo "bbb" >> b
$ hg status
? b
$ hg unshelve
unshelving change 'default'
marked working directory as branch test
$ hg status
M a
? b
$ hg branch
test
$ cd ..
When i shelve commit on newly created branch, make
some changes, unshelve it and running into merge
conflicts i expect that after fixing them and
running unshelve --continue newly created branch
will be preserved.
$ hg init obs-shelve_on_new_branch_conflict
$ cd obs-shelve_on_new_branch_conflict
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ echo "aaa" >> a
$ hg commit -A -m "a"
adding a
$ hg branch
default
$ hg branch test
marked working directory as branch test
(branches are permanent and global, did you want a bookmark?)
$ echo "bbb" >> a
$ hg status
M a
$ hg shelve
shelved as default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch
default
$ echo "ccc" >> a
$ hg status
M a
$ hg unshelve
unshelving change 'default'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing 1:425c97ef07f3 "changes to: a"
merging a
warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
[1]
$ echo "aaabbbccc" > a
$ rm a.orig
$ hg resolve --mark a
(no more unresolved files)
continue: hg unshelve --continue
$ hg unshelve --continue
rebasing 1:425c97ef07f3 "changes to: a"
marked working directory as branch test
unshelve of 'default' complete
$ cat a
aaabbbccc
$ hg status
M a
$ hg branch
test
$ hg commit -m "test-commit"
When i shelve on test branch, update to default branch
and unshelve i expect that it will not preserve previous
test branch.
$ echo "xxx" > b
$ hg add b
$ hg shelve
shelved as test
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg update -r default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg unshelve
unshelving change 'test'
rebasing shelved changes
rebasing *:357525f34729 "changes to: test-commit"* (glob)
$ hg status
A b
$ hg branch
default
$ cd ..
When i unshelve resulting in merge conflicts and makes saved
file shelvedstate looks like in previous versions in
mercurial(without restore branch information in 7th line) i
expect that after resolving conflicts and successfully
running 'shelve --continue' the branch information won't be
restored and branch will be unchanged.
shelve on new branch, conflict with previous shelvedstate
$ hg init obs-conflict
$ cd obs-conflict
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ echo "aaa" >> a
$ hg commit -A -m "a"
adding a
$ hg branch
default
$ hg branch test
marked working directory as branch test
(branches are permanent and global, did you want a bookmark?)
$ echo "bbb" >> a
$ hg status
M a
$ hg shelve
shelved as default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch
default
$ echo "ccc" >> a
$ hg status
M a
$ hg unshelve
unshelving change 'default'
temporarily committing pending changes (restore with 'hg unshelve --abort')
rebasing shelved changes
rebasing 1:425c97ef07f3 "changes to: a"
merging a
warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
[1]
Removing restore branch information from shelvedstate file(making it looks like
in previous versions) and running unshelve --continue
$ cp .hg/shelvedstate .hg/shelvedstate_old
$ cat .hg/shelvedstate_old | grep -v 'branchtorestore' > .hg/shelvedstate
$ echo "aaabbbccc" > a
$ rm a.orig
$ hg resolve --mark a
(no more unresolved files)
continue: hg unshelve --continue
$ hg unshelve --continue
rebasing 1:425c97ef07f3 "changes to: a"
unshelve of 'default' complete
$ cat a
aaabbbccc
$ hg status
M a
$ hg branch
default
$ cd ..
On non bare shelve the branch information shouldn't be restored
$ hg init obssh-bare_shelve_on_new_branch
$ cd obssh-bare_shelve_on_new_branch
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ echo "aaa" >> a
$ hg commit -A -m "a"
adding a
$ hg branch
default
$ hg branch test
marked working directory as branch test
(branches are permanent and global, did you want a bookmark?)
$ echo "bbb" >> a
$ hg status
M a
$ hg shelve a
shelved as default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch
test
$ hg branch default
marked working directory as branch default
(branches are permanent and global, did you want a bookmark?)
$ echo "bbb" >> b
$ hg status
? b
$ hg unshelve
unshelving change 'default'
$ hg status
M a
? b
$ hg branch
default
$ cd ..
Prepare unshelve with a corrupted shelvedstate
$ hg init obssh-r1 && cd obssh-r1
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ echo text1 > file && hg add file
$ hg shelve
shelved as default
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo text2 > file && hg ci -Am text1
adding file
$ hg unshelve
unshelving change 'default'
rebasing shelved changes
rebasing 0:396ea74229f9 "(changes in empty repository)"
merging file
warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
[1]
$ echo somethingsomething > .hg/shelvedstate
Unshelve --continue fails with appropriate message if shelvedstate is corrupted
$ hg unshelve --continue
abort: corrupted shelved state file
(please run hg unshelve --abort to abort unshelve operation)
[255]
Unshelve --abort works with a corrupted shelvedstate
$ hg unshelve --abort
could not read shelved state file, your working copy may be in an unexpected state
please update to some commit
Unshelve --abort fails with appropriate message if there's no unshelve in
progress
$ hg unshelve --abort
abort: no unshelve in progress
[255]
$ cd ..
Unshelve respects --keep even if user intervention is needed
$ hg init obs-unshelvekeep && cd obs-unshelvekeep
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ echo 1 > file && hg ci -Am 1
adding file
$ echo 2 >> file
$ hg shelve
shelved as default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo 3 >> file && hg ci -Am 13
$ hg shelve --list
default (*s ago) changes to: 1 (glob)
$ hg unshelve --keep
unshelving change 'default'
rebasing shelved changes
rebasing 1:3fbe6fbb0bef "changes to: 1"
merging file
warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
[1]
$ hg resolve --mark file
(no more unresolved files)
continue: hg unshelve --continue
$ hg unshelve --continue
rebasing 1:3fbe6fbb0bef "changes to: 1"
unshelve of 'default' complete
$ hg shelve --list
default (*s ago) changes to: 1 (glob)
$ cd ..
Unshelving a stripped commit aborts with an explanatory message
$ hg init obs-unshelve-stripped-commit && cd obs-unshelve-stripped-commit
$ cat <<EOF >> .hg/hgrc
> [experimental]
> evolution=createmarkers
> obsshelve=True
> EOF
$ echo 1 > file && hg ci -Am 1
adding file
$ echo 2 >> file
$ hg shelve
shelved as default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg strip -r 1 --config experimental.evolution=! --hidden
obsolete feature not enabled but 1 markers found!
saved backup bundle to .* (re)
$ hg unshelve
unshelving change 'default'
abort: shelved node 3fbe6fbb0bef4b761af46e9a7456f02877469fa0 not found in repo
[255]
Enabling both shelve and obsshelve should not be allowed
$ hg --config extensions.obsshelve=$TESTDIR/../hgext3rd/obsshelve.py --config extensions.shelve= log -r .
extension 'shelve' overrides commands: * (glob)
abort: shelve must be disabled when obsshelve is enabled
[255]
$ cd ..
Obsshelve knows how to unshelve traditional shelves
$ hg init tradshelves && cd tradshelves
$ echo root > root && hg ci -Am root
adding root
$ echo something >> root
$ hg diff
diff --git a/root b/root
--- a/root
+++ b/root
@@ -1,1 +1,2 @@
root
+something
$ hg shelve --config extensions.obsshelve=! --config extensions.shelve=
shelved as default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ ls .hg/shelved/default.hg # .hg extension indicates a traditional shelve
.hg/shelved/default.hg
$ hg unshelve --keep
unshelving change 'default'
$ hg diff
diff --git a/root b/root
--- a/root
+++ b/root
@@ -1,1 +1,2 @@
root
+something
$ cd ..