From ab236a6008a388e16a6c360ea76e16cfcae82d71 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 17 Aug 2022 11:26:05 +0200 Subject: [PATCH] Fix divergence bug in undo/redo As part of #1405, we changed the way we performed undo and redo to support combining transactions that were not temporally adjacent for IME purposes. We introduced a bug with that release that caused divergence when performing undo: the bug was caused by only changing the visibility of fragments whose insertion id was contained in the undo operation. However, an undo operation also affects deletions which we were mistakenly not considering. Randomized tests caught this but I guess we didn't run enough of them. --- crates/language/src/proto.rs | 2 -- crates/rpc/proto/zed.proto | 3 +-- crates/text/src/text.rs | 12 ++---------- 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/crates/language/src/proto.rs b/crates/language/src/proto.rs index 047cef3ab6..df1e0e0959 100644 --- a/crates/language/src/proto.rs +++ b/crates/language/src/proto.rs @@ -39,7 +39,6 @@ pub fn serialize_operation(operation: &Operation) -> proto::Operation { local_timestamp: undo.id.value, lamport_timestamp: lamport_timestamp.value, version: serialize_version(&undo.version), - transaction_version: serialize_version(&undo.transaction_version), counts: undo .counts .iter() @@ -199,7 +198,6 @@ pub fn deserialize_operation(message: proto::Operation) -> Result { ) }) .collect(), - transaction_version: deserialize_version(undo.transaction_version), }, }), proto::operation::Variant::UpdateSelections(message) => { diff --git a/crates/rpc/proto/zed.proto b/crates/rpc/proto/zed.proto index f52815a8be..3da7f62ac7 100644 --- a/crates/rpc/proto/zed.proto +++ b/crates/rpc/proto/zed.proto @@ -901,8 +901,7 @@ message Operation { uint32 local_timestamp = 2; uint32 lamport_timestamp = 3; repeated VectorClockEntry version = 4; - repeated VectorClockEntry transaction_version = 6; - repeated UndoCount counts = 7; + repeated UndoCount counts = 5; } message UpdateSelections { diff --git a/crates/text/src/text.rs b/crates/text/src/text.rs index ff78f4a14b..1f2e4e7c7a 100644 --- a/crates/text/src/text.rs +++ b/crates/text/src/text.rs @@ -512,7 +512,6 @@ pub struct EditOperation { pub struct UndoOperation { pub id: clock::Local, pub counts: HashMap, - pub transaction_version: clock::Global, pub version: clock::Global, } @@ -1109,14 +1108,8 @@ impl Buffer { let mut fragment = fragment.clone(); let fragment_was_visible = fragment.visible; - if fragment.was_visible(&undo.transaction_version, &self.undo_map) - || undo - .counts - .contains_key(&fragment.insertion_timestamp.local()) - { - fragment.visible = fragment.is_visible(&self.undo_map); - fragment.max_undos.observe(undo.id); - } + fragment.visible = fragment.is_visible(&self.undo_map); + fragment.max_undos.observe(undo.id); let old_start = old_fragments.start().1; let new_start = new_fragments.summary().text.visible; @@ -1297,7 +1290,6 @@ impl Buffer { id: self.local_clock.tick(), version: self.version(), counts, - transaction_version: transaction.start, }; self.apply_undo(&undo)?; let operation = Operation::Undo {