Index: tools/telemetry/third_party/rope/rope/contrib/changestack.py |
diff --git a/tools/telemetry/third_party/rope/rope/contrib/changestack.py b/tools/telemetry/third_party/rope/rope/contrib/changestack.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..70f2271f7c640229788823cdda7c6df18ea787de |
--- /dev/null |
+++ b/tools/telemetry/third_party/rope/rope/contrib/changestack.py |
@@ -0,0 +1,52 @@ |
+"""For performing many refactorings as a single command |
+ |
+`changestack` module can be used to perform many refactorings on top |
+of each other as one bigger command. It can be used like:: |
+ |
+ stack = ChangeStack(project, 'my big command') |
+ |
+ #.. |
+ stack.push(refactoring1.get_changes()) |
+ #.. |
+ stack.push(refactoring2.get_changes()) |
+ #.. |
+ stack.push(refactoringX.get_changes()) |
+ |
+ stack.pop_all() |
+ changes = stack.merged() |
+ |
+Now `changes` can be previewed or performed as before. |
+""" |
+ |
+from rope.base import change |
+ |
+ |
+class ChangeStack(object): |
+ |
+ def __init__(self, project, description='merged changes'): |
+ self.project = project |
+ self.description = description |
+ self.stack = [] |
+ |
+ def push(self, changes): |
+ self.stack.append(changes) |
+ self.project.do(changes) |
+ |
+ def pop_all(self): |
+ for i in range(len(self.stack)): |
+ self.project.history.undo(drop=True) |
+ |
+ def merged(self): |
+ result = change.ChangeSet(self.description) |
+ for changes in self.stack: |
+ for c in self._basic_changes(changes): |
+ result.add_change(c) |
+ return result |
+ |
+ def _basic_changes(self, changes): |
+ if isinstance(changes, change.ChangeSet): |
+ for child in changes.changes: |
+ for atom in self._basic_changes(child): |
+ yield atom |
+ else: |
+ yield changes |