mercurial/cmdutil.py
changeset 26632 59b5e8844eb0
parent 26587 56b2bcea2529
child 26639 92d67e5729b9
equal deleted inserted replaced
26631:e077ce385609 26632:59b5e8844eb0
  3328 
  3328 
  3329     This just removes the backup file at ``close()`` before ``release()``.
  3329     This just removes the backup file at ``close()`` before ``release()``.
  3330     '''
  3330     '''
  3331 
  3331 
  3332     def __init__(self, repo, name):
  3332     def __init__(self, repo, name):
  3333         repo.dirstate.write()
       
  3334         self._repo = repo
  3333         self._repo = repo
  3335         self._filename = 'dirstate.backup.%s.%d' % (name, id(self))
  3334         self._suffix = '.backup.%s.%d' % (name, id(self))
  3336         repo.vfs.write(self._filename, repo.vfs.tryread('dirstate'))
  3335         repo.dirstate._savebackup(repo, self._suffix)
  3337         self._active = True
  3336         self._active = True
  3338         self._closed = False
  3337         self._closed = False
  3339 
  3338 
  3340     def __del__(self):
  3339     def __del__(self):
  3341         if self._active: # still active
  3340         if self._active: # still active
  3345             # ``release(tr, ....)``.
  3344             # ``release(tr, ....)``.
  3346             self._abort()
  3345             self._abort()
  3347 
  3346 
  3348     def close(self):
  3347     def close(self):
  3349         if not self._active: # already inactivated
  3348         if not self._active: # already inactivated
  3350             msg = (_("can't close already inactivated backup: %s")
  3349             msg = (_("can't close already inactivated backup: dirstate%s")
  3351                    % self._filename)
  3350                    % self._suffix)
  3352             raise error.Abort(msg)
  3351             raise error.Abort(msg)
  3353 
  3352 
  3354         self._repo.vfs.unlink(self._filename)
  3353         self._repo.dirstate._clearbackup(self._repo, self._suffix)
  3355         self._active = False
  3354         self._active = False
  3356         self._closed = True
  3355         self._closed = True
  3357 
  3356 
  3358     def _abort(self):
  3357     def _abort(self):
  3359         # this "invalidate()" prevents "wlock.release()" from writing
  3358         self._repo.dirstate._restorebackup(self._repo, self._suffix)
  3360         # changes of dirstate out after restoring to original status
       
  3361         self._repo.dirstate.invalidate()
       
  3362 
       
  3363         self._repo.vfs.rename(self._filename, 'dirstate')
       
  3364         self._active = False
  3359         self._active = False
  3365 
  3360 
  3366     def release(self):
  3361     def release(self):
  3367         if not self._closed:
  3362         if not self._closed:
  3368             if not self._active: # already inactivated
  3363             if not self._active: # already inactivated
  3369                 msg = (_("can't release already inactivated backup: %s")
  3364                 msg = (_("can't release already inactivated backup:"
  3370                        % self._filename)
  3365                          " dirstate%s")
       
  3366                        % self._suffix)
  3371                 raise error.Abort(msg)
  3367                 raise error.Abort(msg)
  3372             self._abort()
  3368             self._abort()
  3373 
  3369 
  3374 _bundlecompspecs = {'none': None,
  3370 _bundlecompspecs = {'none': None,
  3375                     'bzip2': 'BZ',
  3371                     'bzip2': 'BZ',