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

login
register
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

Comments

Katsunori FUJIWARA - Oct. 7, 2015, 4:50 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# 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.

    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.

Patch

diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -330,10 +330,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"""