Use lowest common ancestor search in History::changes_since
This commit is contained in:
parent
9a9e462183
commit
9387dfafed
1 changed files with 9 additions and 25 deletions
|
@ -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.
|
||||
|
|
Loading…
Add table
Reference in a new issue