diff --git a/hgext/shelve.py b/hgext/shelve.py --- a/hgext/shelve.py +++ b/hgext/shelve.py @@ -765,6 +765,7 @@ def _commitworkingcopychanges(ui, repo, def _unshelverestorecommit(ui, repo, basename): """Recreate commit in the repository during the unshelve""" repo = repo.unfiltered() + node = None if shelvedfile(repo, basename, 'shelve').exists(): node = shelvedfile(repo, basename, 'shelve').readinfo()['node'] if node is None or node not in repo: @@ -774,7 +775,7 @@ def _unshelverestorecommit(ui, repo, bas # We might not strip the unbundled changeset, so we should keep track of # the unshelve node in case we need to reuse it (eg: unshelve --keep) if node is None: - info = {'node': nodemod.hex(node)} + info = {'node': nodemod.hex(shelvectx.node())} shelvedfile(repo, basename, 'shelve').writeinfo(info) else: shelvectx = repo[node] diff --git a/tests/test-shelve.t b/tests/test-shelve.t --- a/tests/test-shelve.t +++ b/tests/test-shelve.t @@ -1793,5 +1793,23 @@ putting v1 shelvedstate file in place of mercurial does not crash $ hg unshelve --continue unshelve of 'ashelve' complete + +Unshelve without .shelve metadata: + + $ hg shelve + shelved as default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ rm .hg/shelved/default.shelve + $ echo 3 > a + $ hg unshelve + unshelving change 'default' + temporarily committing pending changes (restore with 'hg unshelve --abort') + rebasing shelved changes + merging a + warning: conflicts while merging a! (edit, then use 'hg resolve --mark') + unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue') + [1] + $ cat .hg/shelved/default.shelve + node=82e0cb9893247d12667017593ce1e5655860f1ac + $ cd .. -