# HG changeset patch # User FUJIWARA Katsunori # Date 1444236090 -32400 # Node ID 1d23bf6cd90a84067552eca8f8c009ad70b71e6a # Parent 10f14bb229504568d84cf3bee6458d529fcad7dc shelve: restore shelved dirstate explicitly after aborting transaction Before this patch, "hg shelve" uses aborting a current transaction to discard temporary changes while shelving. This assumes that dirstate changes in a transaction scope are kept even after aborting it. But this assumption will be broken by "transactional dirstate". See the wiki page below for detail about it. https://mercurial.selenic.com/wiki/DirstateTransactionPlan This patch explicitly saves shelved dirstate just before aborting current transaction, and restore dirstate with it after aborting by utility function '_aborttransaction()' added by previous patch. This patch replaces 'if tr: tr.abort()' by 'lockmod.release(tr)', because the former is already done in '_aborttransaction()' (and the latter has no effect), if current transaction is aborted in it successfully. Otherwise, the latter is enough to trigger aborting. diff -r 10f14bb22950 -r 1d23bf6cd90a hgext/shelve.py --- a/hgext/shelve.py Thu Oct 08 01:41:30 2015 +0900 +++ b/hgext/shelve.py Thu Oct 08 01:41:30 2015 +0900 @@ -340,10 +340,10 @@ desc = util.ellipsis(desc, ui.termwidth()) ui.status(_('shelved as %s\n') % name) hg.update(repo, parent.node()) + + _aborttransaction(repo) finally: - if tr: - tr.abort() - lockmod.release(lock, wlock) + lockmod.release(tr, lock, wlock) def cleanupcmd(ui, repo): """subcommand that deletes all shelves"""