shelve: make --keep option survive user intervention (
issue5431)
Currently if user runs 'hg unshelve --keep' and merge conflicts
occur, the information about --keep provided by user is lost and
shelf is deleted after 'hg unshelve --continue'. This is obviously
not desired, so this patch fixes it.
--- a/hgext/shelve.py Thu Nov 24 01:15:34 2016 +0000
+++ b/hgext/shelve.py Wed Nov 23 14:58:52 2016 -0800
@@ -159,6 +159,8 @@
"""
_version = 1
_filename = 'shelvedstate'
+ _keep = 'keep'
+ _nokeep = 'nokeep'
@classmethod
def load(cls, repo):
@@ -175,6 +177,7 @@
parents = [nodemod.bin(h) for h in fp.readline().split()]
stripnodes = [nodemod.bin(h) for h in fp.readline().split()]
branchtorestore = fp.readline().strip()
+ keep = fp.readline().strip() == cls._keep
except (ValueError, TypeError) as err:
raise error.CorruptedState(str(err))
finally:
@@ -188,6 +191,7 @@
obj.parents = parents
obj.stripnodes = stripnodes
obj.branchtorestore = branchtorestore
+ obj.keep = keep
except error.RepoLookupError as err:
raise error.CorruptedState(str(err))
@@ -195,7 +199,7 @@
@classmethod
def save(cls, repo, name, originalwctx, pendingctx, stripnodes,
- branchtorestore):
+ branchtorestore, keep=False):
fp = repo.vfs(cls._filename, 'wb')
fp.write('%i\n' % cls._version)
fp.write('%s\n' % name)
@@ -206,6 +210,7 @@
fp.write('%s\n' %
' '.join([nodemod.hex(n) for n in stripnodes]))
fp.write('%s\n' % branchtorestore)
+ fp.write('%s\n' % (cls._keep if keep else cls._nokeep))
fp.close()
@classmethod
@@ -680,7 +685,7 @@
stripnodes = [repo.changelog.node(rev)
for rev in xrange(oldtiprev, len(repo))]
shelvedstate.save(repo, basename, pctx, tmpwctx, stripnodes,
- branchtorestore)
+ branchtorestore, opts.get('keep'))
util.rename(repo.join('rebasestate'),
repo.join('unshelverebasestate'))
@@ -782,6 +787,8 @@
try:
state = shelvedstate.load(repo)
+ if opts.get('keep') is None:
+ opts['keep'] = state.keep
except IOError as err:
if err.errno != errno.ENOENT:
raise
--- a/tests/test-shelve.t Thu Nov 24 01:15:34 2016 +0000
+++ b/tests/test-shelve.t Wed Nov 23 14:58:52 2016 -0800
@@ -1622,3 +1622,31 @@
abort: no unshelve in progress
[255]
$ cd ..
+
+Unshelve respects --keep even if user intervention is needed
+ $ hg init unshelvekeep
+ $ 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 (1s ago) changes to: 1
+ $ hg unshelve --keep
+ unshelving change 'default'
+ rebasing shelved changes
+ rebasing 3:1d24e58054c8 "changes to: 1" (tip)
+ 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 3:1d24e58054c8 "changes to: 1" (tip)
+ unshelve of 'default' complete
+ $ hg shelve --list
+ default (1s ago) changes to: 1