aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Davis2022-11-27 18:46:36 +0000
committerBlaž Hrastnik2022-11-29 16:15:20 +0000
commit9387dfafedfc7051e7682cfdbec09b5b91c76918 (patch)
tree09a82a69790f8dbb095596392e0eaa99b9cd6134
parent9a9e462183cb60bff6450f17173e6b18eadbbfb2 (diff)
Use lowest common ancestor search in History::changes_since
-rw-r--r--helix-core/src/history.rs34
1 files changed, 9 insertions, 25 deletions
diff --git a/helix-core/src/history.rs b/helix-core/src/history.rs
index 82509242..b99e969f 100644
--- a/helix-core/src/history.rs
+++ b/helix-core/src/history.rs
@@ -122,32 +122,16 @@ impl History {
/// Returns the changes since the given revision composed into a transaction.
/// Returns None if there are no changes between the current and given revisions.
pub fn changes_since(&self, revision: usize) -> Option<Transaction> {
- use std::cmp::Ordering::*;
+ let lca = self.lowest_common_ancestor(revision, self.current);
+ let up = self.path_up(revision, lca);
+ let down = self.path_up(self.current, lca);
+ let up_txns = up
+ .iter()
+ .rev()
+ .map(|&n| self.revisions[n].inversion.clone());
+ let down_txns = down.iter().map(|&n| self.revisions[n].transaction.clone());
- match revision.cmp(&self.current) {
- Equal => None,
- Less => {
- let mut child = self.revisions[revision].last_child?.get();
- let mut transaction = self.revisions[child].transaction.clone();
- while child != self.current {
- child = self.revisions[child].last_child?.get();
- transaction = transaction.compose(self.revisions[child].transaction.clone());
- }
- Some(transaction)
- }
- Greater => {
- let mut inversion = self.revisions[revision].inversion.clone();
- let mut parent = self.revisions[revision].parent;
- while parent != self.current {
- parent = self.revisions[parent].parent;
- if parent == 0 {
- return None;
- }
- inversion = inversion.compose(self.revisions[parent].inversion.clone());
- }
- Some(inversion)
- }
- }
+ up_txns.chain(down_txns).reduce(|acc, tx| tx.compose(acc))
}
/// Undo the last edit.