shelve: restore shelved dirstate explicitly after aborting transaction
authorFUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Thu, 08 Oct 2015 01:41:30 +0900
changeset 26523 1d23bf6cd90a
parent 26522 10f14bb22950
child 26524 61c295d9d402
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.
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"""