Path: blob/master/elisp/emacs-for-python/rope-dist/rope/contrib/changestack.py
1494 views
"""For performing many refactorings as a single command12`changestack` module can be used to perform many refactorings on top3of each other as one bigger command. It can be used like::45stack = ChangeStack(project, 'my big command')67#..8stack.push(refactoring1.get_changes())9#..10stack.push(refactoring2.get_changes())11#..12stack.push(refactoringX.get_changes())1314stack.pop_all()15changes = stack.merged()1617Now `changes` can be previewed or performed as before.18"""1920from rope.base import change212223class ChangeStack(object):2425def __init__(self, project, description='merged changes'):26self.project = project27self.description = description28self.stack = []2930def push(self, changes):31self.stack.append(changes)32self.project.do(changes)3334def pop_all(self):35for i in range(len(self.stack)):36self.project.history.undo(drop=True)3738def merged(self):39result = change.ChangeSet(self.description)40for changes in self.stack:41for c in self._basic_changes(changes):42result.add_change(c)43return result4445def _basic_changes(self, changes):46if isinstance(changes, change.ChangeSet):47for child in changes.changes:48for atom in self._basic_changes(child):49yield atom50else:51yield changes525354