mercurial/dirstateguard.py
changeset 43075 57875cf423c9
parent 41227 b74481038438
child 43077 687b865b95ad
equal deleted inserted replaced
43074:9cc55b743713 43075:57875cf423c9
    12 from . import (
    12 from . import (
    13     error,
    13     error,
    14     narrowspec,
    14     narrowspec,
    15     util,
    15     util,
    16 )
    16 )
       
    17 
    17 
    18 
    18 class dirstateguard(util.transactional):
    19 class dirstateguard(util.transactional):
    19     '''Restore dirstate at unexpected failure.
    20     '''Restore dirstate at unexpected failure.
    20 
    21 
    21     At the construction, this class does:
    22     At the construction, this class does:
    32     def __init__(self, repo, name):
    33     def __init__(self, repo, name):
    33         self._repo = repo
    34         self._repo = repo
    34         self._active = False
    35         self._active = False
    35         self._closed = False
    36         self._closed = False
    36         self._backupname = 'dirstate.backup.%s.%d' % (name, id(self))
    37         self._backupname = 'dirstate.backup.%s.%d' % (name, id(self))
    37         self._narrowspecbackupname = ('narrowspec.backup.%s.%d' %
    38         self._narrowspecbackupname = 'narrowspec.backup.%s.%d' % (
    38                                       (name, id(self)))
    39             name,
       
    40             id(self),
       
    41         )
    39         repo.dirstate.savebackup(repo.currenttransaction(), self._backupname)
    42         repo.dirstate.savebackup(repo.currenttransaction(), self._backupname)
    40         narrowspec.savewcbackup(repo, self._narrowspecbackupname)
    43         narrowspec.savewcbackup(repo, self._narrowspecbackupname)
    41         self._active = True
    44         self._active = True
    42 
    45 
    43     def __del__(self):
    46     def __del__(self):
    44         if self._active: # still active
    47         if self._active:  # still active
    45             # this may occur, even if this class is used correctly:
    48             # this may occur, even if this class is used correctly:
    46             # for example, releasing other resources like transaction
    49             # for example, releasing other resources like transaction
    47             # may raise exception before ``dirstateguard.release`` in
    50             # may raise exception before ``dirstateguard.release`` in
    48             # ``release(tr, ....)``.
    51             # ``release(tr, ....)``.
    49             self._abort()
    52             self._abort()
    50 
    53 
    51     def close(self):
    54     def close(self):
    52         if not self._active: # already inactivated
    55         if not self._active:  # already inactivated
    53             msg = (_("can't close already inactivated backup: %s")
    56             msg = (
    54                    % self._backupname)
    57                 _("can't close already inactivated backup: %s")
       
    58                 % self._backupname
       
    59             )
    55             raise error.Abort(msg)
    60             raise error.Abort(msg)
    56 
    61 
    57         self._repo.dirstate.clearbackup(self._repo.currenttransaction(),
    62         self._repo.dirstate.clearbackup(
    58                                          self._backupname)
    63             self._repo.currenttransaction(), self._backupname
       
    64         )
    59         narrowspec.clearwcbackup(self._repo, self._narrowspecbackupname)
    65         narrowspec.clearwcbackup(self._repo, self._narrowspecbackupname)
    60         self._active = False
    66         self._active = False
    61         self._closed = True
    67         self._closed = True
    62 
    68 
    63     def _abort(self):
    69     def _abort(self):
    64         narrowspec.restorewcbackup(self._repo, self._narrowspecbackupname)
    70         narrowspec.restorewcbackup(self._repo, self._narrowspecbackupname)
    65         self._repo.dirstate.restorebackup(self._repo.currenttransaction(),
    71         self._repo.dirstate.restorebackup(
    66                                            self._backupname)
    72             self._repo.currenttransaction(), self._backupname
       
    73         )
    67         self._active = False
    74         self._active = False
    68 
    75 
    69     def release(self):
    76     def release(self):
    70         if not self._closed:
    77         if not self._closed:
    71             if not self._active: # already inactivated
    78             if not self._active:  # already inactivated
    72                 msg = (_("can't release already inactivated backup: %s")
    79                 msg = (
    73                        % self._backupname)
    80                     _("can't release already inactivated backup: %s")
       
    81                     % self._backupname
       
    82                 )
    74                 raise error.Abort(msg)
    83                 raise error.Abort(msg)
    75             self._abort()
    84             self._abort()