def execute(self, on_progress=None): progress_tracker = ProgressTracker(on_progress) n_steps = len(self.steps) last_successful_step = None progress_tracker.report_more_total(n_steps) try: for i in range(n_steps): self.steps[i].execute() progress_tracker.report_more_done(1) last_successful_step = i except Exception as e: with swallow_all_errors(): progress_tracker.report_indeterminate_progress() rollback_ok = self._undo(from_step=last_successful_step) if last_successful_step is not None else True try: raise e except RenamePlanActionError as action_error: raise RenamePlanExecuteFailedBecauseActionFailedError(action_error, rollback_ok) from None except Exception as e: raise RenamePlanExecuteFailedBecauseOtherError(e) from None