[PATCH 1 of 2] shelve: add dirstateguard to prevent unknown working copy parent

Durham Goode durham at fb.com
Mon Sep 28 21:07:02 CDT 2015


# HG changeset patch
# User Durham Goode <durham at fb.com>
# Date 1443491489 25200
#      Mon Sep 28 18:51:29 2015 -0700
# Node ID ff1ab706e6d662d1971c1a6127e60b7063abfe74
# Parent  0224d22ef5d815c86d7ebce6644f056c406acbfd
shelve: add dirstateguard to prevent unknown working copy parent

Previously, ctrl+c during a shelve was extremely likely to cause you to lose
your working copy parent. The dirstateguard should prevent this.

I tested this by adding a hardcoded exception in the middle of the shelve (after
the initial commit) and verified hg status was correct afterwards.

diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -246,6 +246,7 @@ def createcmd(ui, repo, pats, opts):
     try:
         wlock = repo.wlock()
         lock = repo.lock()
+        dsguard = cmdutil.dirstateguard(repo, 'shelve')
 
         bms = repo._bookmarks.copy()
         # use an uncommitted transaction to generate the bundle to avoid
@@ -302,6 +303,7 @@ def createcmd(ui, repo, pats, opts):
             desc = util.ellipsis(desc, ui.termwidth())
         ui.status(_('shelved as %s\n') % name)
         hg.update(repo, parent.node())
+        dsguard.close()
     finally:
         if bms:
             # restore old bookmarks
@@ -309,6 +311,8 @@ def createcmd(ui, repo, pats, opts):
             repo._bookmarks.write()
         if tr:
             tr.abort()
+        if dsguard:
+            dsguard.release()
         lockmod.release(lock, wlock)
 
 def cleanupcmd(ui, repo):


More information about the Mercurial-devel mailing list