##// END OF EJS Templates
transaction: clarify the "quick abort" scenario...
marmoute -
r50888:2f348bab default
parent child Browse files
Show More
@@ -668,42 +668,60 b' class transaction(util.transactional):'
668 self._file.close()
668 self._file.close()
669 self._backupsfile.close()
669 self._backupsfile.close()
670
670
671 quick = self._can_quick_abort(entries)
671 try:
672 try:
672 if not entries and not self._backupentries:
673 if quick:
673 if self._backupjournal:
674 self._do_quick_abort(entries)
674 self._opener.unlink(self._backupjournal)
675 else:
675 if self._journal:
676 self._do_full_abort(entries)
676 self._opener.unlink(self._journal)
677 return
678
679 self._report(_(b"transaction abort!\n"))
680
681 try:
682 for cat in sorted(self._abortcallback):
683 self._abortcallback[cat](self)
684 # Prevent double usage and help clear cycles.
685 self._abortcallback = None
686 _playback(
687 self._journal,
688 self._report,
689 self._opener,
690 self._vfsmap,
691 entries,
692 self._backupentries,
693 False,
694 checkambigfiles=self._checkambigfiles,
695 )
696 self._report(_(b"rollback completed\n"))
697 except BaseException as exc:
698 self._report(_(b"rollback failed - please run hg recover\n"))
699 self._report(
700 _(b"(failure reason: %s)\n") % stringutil.forcebytestr(exc)
701 )
702 finally:
677 finally:
703 self._journal = None
678 self._journal = None
704 self._releasefn(self, False) # notify failure of transaction
679 self._releasefn(self, False) # notify failure of transaction
705 self._releasefn = None # Help prevent cycles.
680 self._releasefn = None # Help prevent cycles.
706
681
682 def _can_quick_abort(self, entries):
683 """False if any semantic content have been written on disk
684
685 True if nothing, except temporary files has been writen on disk."""
686 if entries:
687 return False
688 if self._backupentries:
689 return False
690 return True
691
692 def _do_quick_abort(self, entries):
693 """(Silently) do a quick cleanup (see _can_quick_abort)"""
694 assert self._can_quick_abort(entries)
695 if self._backupjournal:
696 self._opener.unlink(self._backupjournal)
697 if self._journal:
698 self._opener.unlink(self._journal)
699
700 def _do_full_abort(self, entries):
701 """(Noisily) rollback all the change introduced by the transaction"""
702 self._report(_(b"transaction abort!\n"))
703 try:
704 for cat in sorted(self._abortcallback):
705 self._abortcallback[cat](self)
706 # Prevent double usage and help clear cycles.
707 self._abortcallback = None
708 _playback(
709 self._journal,
710 self._report,
711 self._opener,
712 self._vfsmap,
713 entries,
714 self._backupentries,
715 False,
716 checkambigfiles=self._checkambigfiles,
717 )
718 self._report(_(b"rollback completed\n"))
719 except BaseException as exc:
720 self._report(_(b"rollback failed - please run hg recover\n"))
721 self._report(
722 _(b"(failure reason: %s)\n") % stringutil.forcebytestr(exc)
723 )
724
707
725
708 BAD_VERSION_MSG = _(
726 BAD_VERSION_MSG = _(
709 b"journal was created by a different version of Mercurial\n"
727 b"journal was created by a different version of Mercurial\n"
General Comments 0
You need to be logged in to leave comments. Login now