Patchwork [4,of,5] shelve: restore shelved dirstate explicitly after aborting transaction

mail settings
Submitter Katsunori FUJIWARA
Date Oct. 7, 2015, 4:50 p.m.
Message ID <d59f0de5ef4958855f23.1444236627@feefifofum>
Download mbox | patch
Permalink /patch/10858/
State Accepted
Headers show


Katsunori FUJIWARA - Oct. 7, 2015, 4:50 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <>
# Date 1444236090 -32400
#      Thu Oct 08 01:41:30 2015 +0900
# Node ID d59f0de5ef4958855f23937763ccb592b08d9fef
# Parent  cb12807bd31bde021dfab956246541d8b2be41f9
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.

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 --git a/hgext/ b/hgext/
--- a/hgext/
+++ b/hgext/
@@ -330,10 +330,10 @@ 
             desc = util.ellipsis(desc, ui.termwidth())
         ui.status(_('shelved as %s\n') % name)
         hg.update(repo, parent.node())
+        _aborttransaction(repo)
-        if tr:
-            tr.abort()
-        lockmod.release(lock, wlock)
+        lockmod.release(tr, lock, wlock)
 def cleanupcmd(ui, repo):
     """subcommand that deletes all shelves"""