dirstateguard: move to new module so I can break some layering violations
Recently in a review I noticed that localrepo almost has no reason to
import cmdutil anymore. Also, cmdutil is a little on the enormous
side, so breaking this class out strikes me as a win.
--- a/mercurial/cmdutil.py Mon Nov 21 22:17:45 2016 -0500
+++ b/mercurial/cmdutil.py Mon Nov 21 21:29:32 2016 -0500
@@ -27,6 +27,7 @@
changelog,
copies,
crecord as crecordmod,
+ dirstateguard as dirstateguardmod,
encoding,
error,
formatter,
@@ -3521,57 +3522,4 @@
hint = after[0]
raise error.Abort(_('no %s in progress') % task, hint=hint)
-class dirstateguard(object):
- '''Restore dirstate at unexpected failure.
-
- At the construction, this class does:
-
- - write current ``repo.dirstate`` out, and
- - save ``.hg/dirstate`` into the backup file
-
- This restores ``.hg/dirstate`` from backup file, if ``release()``
- is invoked before ``close()``.
-
- This just removes the backup file at ``close()`` before ``release()``.
- '''
-
- def __init__(self, repo, name):
- self._repo = repo
- self._active = False
- self._closed = False
- self._suffix = '.backup.%s.%d' % (name, id(self))
- repo.dirstate.savebackup(repo.currenttransaction(), self._suffix)
- self._active = True
-
- def __del__(self):
- if self._active: # still active
- # this may occur, even if this class is used correctly:
- # for example, releasing other resources like transaction
- # may raise exception before ``dirstateguard.release`` in
- # ``release(tr, ....)``.
- self._abort()
-
- def close(self):
- if not self._active: # already inactivated
- msg = (_("can't close already inactivated backup: dirstate%s")
- % self._suffix)
- raise error.Abort(msg)
-
- self._repo.dirstate.clearbackup(self._repo.currenttransaction(),
- self._suffix)
- self._active = False
- self._closed = True
-
- def _abort(self):
- self._repo.dirstate.restorebackup(self._repo.currenttransaction(),
- self._suffix)
- self._active = False
-
- def release(self):
- if not self._closed:
- if not self._active: # already inactivated
- msg = (_("can't release already inactivated backup:"
- " dirstate%s")
- % self._suffix)
- raise error.Abort(msg)
- self._abort()
+dirstateguard = dirstateguardmod.dirstateguard
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/dirstateguard.py Mon Nov 21 21:29:32 2016 -0500
@@ -0,0 +1,69 @@
+# dirstateguard.py - class to allow restoring dirstate after failure
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import absolute_import
+
+from .i18n import _
+
+from . import (
+ error,
+)
+
+class dirstateguard(object):
+ '''Restore dirstate at unexpected failure.
+
+ At the construction, this class does:
+
+ - write current ``repo.dirstate`` out, and
+ - save ``.hg/dirstate`` into the backup file
+
+ This restores ``.hg/dirstate`` from backup file, if ``release()``
+ is invoked before ``close()``.
+
+ This just removes the backup file at ``close()`` before ``release()``.
+ '''
+
+ def __init__(self, repo, name):
+ self._repo = repo
+ self._active = False
+ self._closed = False
+ self._suffix = '.backup.%s.%d' % (name, id(self))
+ repo.dirstate.savebackup(repo.currenttransaction(), self._suffix)
+ self._active = True
+
+ def __del__(self):
+ if self._active: # still active
+ # this may occur, even if this class is used correctly:
+ # for example, releasing other resources like transaction
+ # may raise exception before ``dirstateguard.release`` in
+ # ``release(tr, ....)``.
+ self._abort()
+
+ def close(self):
+ if not self._active: # already inactivated
+ msg = (_("can't close already inactivated backup: dirstate%s")
+ % self._suffix)
+ raise error.Abort(msg)
+
+ self._repo.dirstate.clearbackup(self._repo.currenttransaction(),
+ self._suffix)
+ self._active = False
+ self._closed = True
+
+ def _abort(self):
+ self._repo.dirstate.restorebackup(self._repo.currenttransaction(),
+ self._suffix)
+ self._active = False
+
+ def release(self):
+ if not self._closed:
+ if not self._active: # already inactivated
+ msg = (_("can't release already inactivated backup:"
+ " dirstate%s")
+ % self._suffix)
+ raise error.Abort(msg)
+ self._abort()