mercurial/localrepo.py
changeset 26631 e077ce385609
parent 26587 56b2bcea2529
child 26634 09bb1ee7e73e
--- a/mercurial/localrepo.py	Wed Oct 14 02:40:04 2015 +0900
+++ b/mercurial/localrepo.py	Tue Oct 13 12:25:43 2015 -0700
@@ -11,7 +11,7 @@
 import changelog, dirstate, filelog, manifest, context, bookmarks, phases
 import lock as lockmod
 import transaction, store, encoding, exchange, bundle2
-import scmutil, util, extensions, hook, error, revset
+import scmutil, util, extensions, hook, error, revset, cmdutil
 import match as matchmod
 import merge as mergemod
 import tags as tagsmod
@@ -1084,20 +1084,22 @@
             lock.release()
 
     def rollback(self, dryrun=False, force=False):
-        wlock = lock = None
+        wlock = lock = dsguard = None
         try:
             wlock = self.wlock()
             lock = self.lock()
             if self.svfs.exists("undo"):
-                return self._rollback(dryrun, force)
+                dsguard = cmdutil.dirstateguard(self, 'rollback')
+
+                return self._rollback(dryrun, force, dsguard)
             else:
                 self.ui.warn(_("no rollback information available\n"))
                 return 1
         finally:
-            release(lock, wlock)
+            release(dsguard, lock, wlock)
 
     @unfilteredmethod # Until we get smarter cache management
-    def _rollback(self, dryrun, force):
+    def _rollback(self, dryrun, force, dsguard):
         ui = self.ui
         try:
             args = self.vfs.read('undo.desc').splitlines()
@@ -1140,6 +1142,9 @@
         parentgone = (parents[0] not in self.changelog.nodemap or
                       parents[1] not in self.changelog.nodemap)
         if parentgone:
+            # prevent dirstateguard from overwriting already restored one
+            dsguard.close()
+
             self.vfs.rename('undo.dirstate', 'dirstate')
             try:
                 branch = self.vfs.read('undo.branch')