on master help sign in
Follow parent links when calculating changes since a revision
a3f321aMichael Davis
helix-core/src/history.rs+21−10
@@ -126,16 +126,27 @@ impl History {
126
126
127 match revision.cmp(&self.current) {
127 match revision.cmp(&self.current) {
128 Equal => None,
128 Equal => None,
129+ Less => {
130+ let mut child = self.revisions[revision].last_child?.get();
131+ let mut transaction = self.revisions[child].transaction.clone();
132+ while child != self.current {
133+ child = self.revisions[child].last_child?.get();
134+ transaction = transaction.compose(self.revisions[child].transaction.clone());
135+ }
136+ Some(transaction)
137+ }
138+ Greater => {
129− Greater => self.revisions[self.current + 1..=revision]
139+ let mut inversion = self.revisions[revision].inversion.clone();
130− .iter()
140+ let mut parent = self.revisions[revision].parent;
131− .map(|revision| &revision.inversion)
141+ while parent != self.current {
132− .cloned()
142+ parent = self.revisions[parent].parent;
133− .reduce(|acc, inversion| acc.compose(inversion)),
143+ if parent == 0 {
134− Less => self.revisions[revision + 1..=self.current]
144+ return None;
135− .iter()
145+ }
136− .map(|revision| &revision.transaction)
146+ inversion = inversion.compose(self.revisions[parent].inversion.clone());
137− .cloned()
147+ }
138− .reduce(|acc, transaction| acc.compose(transaction)),
148+ Some(inversion)
149+ }
139 }
150 }
140 }
151 }
141
152
helix-term/tests/test/commands.rs+3
@@ -306,5 +306,8 @@ async fn test_undo_redo() -> anyhow::Result<()> {
306 // * <C-i> Jump forward to line 1.
306 // * <C-i> Jump forward to line 1.
307 test(("#[|]#", "[<space><C-s>kduU<C-o><C-i>", "#[|]#")).await?;
307 test(("#[|]#", "[<space><C-s>kduU<C-o><C-i>", "#[|]#")).await?;
308
308
309+ // In this case we 'redo' manually to ensure that the transactions are composing correctly.
310+ test(("#[|]#", "[<space>u[<space>u", "#[|]#")).await?;
311+
309 Ok(())
312 Ok(())
310}
313}