mercurial/cmdutil.py
changeset 30488 751639bf6fc4
parent 30473 39d13b8c101d
child 30493 762c8a128357
equal deleted inserted replaced
30487:88a448a12ae8 30488:751639bf6fc4
    25 from . import (
    25 from . import (
    26     bookmarks,
    26     bookmarks,
    27     changelog,
    27     changelog,
    28     copies,
    28     copies,
    29     crecord as crecordmod,
    29     crecord as crecordmod,
       
    30     dirstateguard as dirstateguardmod,
    30     encoding,
    31     encoding,
    31     error,
    32     error,
    32     formatter,
    33     formatter,
    33     graphmod,
    34     graphmod,
    34     lock as lockmod,
    35     lock as lockmod,
  3519     hint = None
  3520     hint = None
  3520     if after[1]:
  3521     if after[1]:
  3521         hint = after[0]
  3522         hint = after[0]
  3522     raise error.Abort(_('no %s in progress') % task, hint=hint)
  3523     raise error.Abort(_('no %s in progress') % task, hint=hint)
  3523 
  3524 
  3524 class dirstateguard(object):
  3525 dirstateguard = dirstateguardmod.dirstateguard
  3525     '''Restore dirstate at unexpected failure.
       
  3526 
       
  3527     At the construction, this class does:
       
  3528 
       
  3529     - write current ``repo.dirstate`` out, and
       
  3530     - save ``.hg/dirstate`` into the backup file
       
  3531 
       
  3532     This restores ``.hg/dirstate`` from backup file, if ``release()``
       
  3533     is invoked before ``close()``.
       
  3534 
       
  3535     This just removes the backup file at ``close()`` before ``release()``.
       
  3536     '''
       
  3537 
       
  3538     def __init__(self, repo, name):
       
  3539         self._repo = repo
       
  3540         self._active = False
       
  3541         self._closed = False
       
  3542         self._suffix = '.backup.%s.%d' % (name, id(self))
       
  3543         repo.dirstate.savebackup(repo.currenttransaction(), self._suffix)
       
  3544         self._active = True
       
  3545 
       
  3546     def __del__(self):
       
  3547         if self._active: # still active
       
  3548             # this may occur, even if this class is used correctly:
       
  3549             # for example, releasing other resources like transaction
       
  3550             # may raise exception before ``dirstateguard.release`` in
       
  3551             # ``release(tr, ....)``.
       
  3552             self._abort()
       
  3553 
       
  3554     def close(self):
       
  3555         if not self._active: # already inactivated
       
  3556             msg = (_("can't close already inactivated backup: dirstate%s")
       
  3557                    % self._suffix)
       
  3558             raise error.Abort(msg)
       
  3559 
       
  3560         self._repo.dirstate.clearbackup(self._repo.currenttransaction(),
       
  3561                                          self._suffix)
       
  3562         self._active = False
       
  3563         self._closed = True
       
  3564 
       
  3565     def _abort(self):
       
  3566         self._repo.dirstate.restorebackup(self._repo.currenttransaction(),
       
  3567                                            self._suffix)
       
  3568         self._active = False
       
  3569 
       
  3570     def release(self):
       
  3571         if not self._closed:
       
  3572             if not self._active: # already inactivated
       
  3573                 msg = (_("can't release already inactivated backup:"
       
  3574                          " dirstate%s")
       
  3575                        % self._suffix)
       
  3576                 raise error.Abort(msg)
       
  3577             self._abort()