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() |
|