From patchwork Wed Oct 7 16:50:28 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [5, of, 5] shelve: restore unshelved dirstate explicitly after aborting transaction From: Katsunori FUJIWARA X-Patchwork-Id: 10857 Message-Id: <20da185f655fd34bc366.1444236628@feefifofum> To: mercurial-devel@selenic.com Date: Thu, 08 Oct 2015 01:50:28 +0900 # HG changeset patch # User FUJIWARA Katsunori # Date 1444236090 -32400 # Thu Oct 08 01:41:30 2015 +0900 # Node ID 20da185f655fd34bc366460ab7f2486f33eb7fd3 # Parent d59f0de5ef4958855f23937763ccb592b08d9fef shelve: restore unshelved dirstate explicitly after aborting transaction Before this patch, "hg unshelve" uses aborting a current transaction to discard temporary changes while unshelving. 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. diff --git a/hgext/shelve.py b/hgext/shelve.py --- a/hgext/shelve.py +++ b/hgext/shelve.py @@ -724,6 +724,8 @@ repo.unfiltered().changelog.strip(oldtiprev, tr) unshelvecleanup(ui, repo, basename, opts) + + _aborttransaction(repo) finally: ui.quiet = oldquiet if tr: