Relay saved version metadata to ensure buffers modified state converges

Antonio Scandurra created

Change summary

crates/language/src/buffer.rs | 10 ++++++++++
crates/project/src/project.rs | 13 +++++++++++++
crates/rpc/proto/zed.proto    |  5 +++--
3 files changed, 26 insertions(+), 2 deletions(-)

Detailed changes

crates/language/src/buffer.rs 🔗

@@ -385,6 +385,7 @@ impl Buffer {
             rpc::proto::LineEnding::from_i32(message.line_ending)
                 .ok_or_else(|| anyhow!("missing line_ending"))?,
         ));
+        this.saved_version = proto::deserialize_version(message.saved_version);
         this.saved_version_fingerprint = message.saved_version_fingerprint;
         this.saved_mtime = message
             .saved_mtime
@@ -400,6 +401,7 @@ impl Buffer {
             base_text: self.base_text().to_string(),
             diff_base: self.diff_base.as_ref().map(|h| h.to_string()),
             line_ending: proto::serialize_line_ending(self.line_ending()) as i32,
+            saved_version: proto::serialize_version(&self.saved_version),
             saved_version_fingerprint: self.saved_version_fingerprint.clone(),
             saved_mtime: Some(self.saved_mtime.into()),
         }
@@ -556,6 +558,14 @@ impl Buffer {
         &self.saved_version
     }
 
+    pub fn saved_version_fingerprint(&self) -> &str {
+        &self.saved_version_fingerprint
+    }
+
+    pub fn saved_mtime(&self) -> SystemTime {
+        self.saved_mtime
+    }
+
     pub fn set_language(&mut self, language: Option<Arc<Language>>, cx: &mut ModelContext<Self>) {
         self.syntax_map.lock().clear();
         self.language = language;

crates/project/src/project.rs 🔗

@@ -5209,6 +5209,19 @@ impl Project {
                         })
                         .log_err();
 
+                    client
+                        .send(proto::BufferReloaded {
+                            project_id,
+                            buffer_id,
+                            version: language::proto::serialize_version(buffer.saved_version()),
+                            mtime: Some(buffer.saved_mtime().into()),
+                            fingerprint: buffer.saved_version_fingerprint().into(),
+                            line_ending: language::proto::serialize_line_ending(
+                                buffer.line_ending(),
+                            ) as i32,
+                        })
+                        .log_err();
+
                     cx.background()
                         .spawn(
                             async move {

crates/rpc/proto/zed.proto 🔗

@@ -975,8 +975,9 @@ message BufferState {
     string base_text = 3;
     optional string diff_base = 4;
     LineEnding line_ending = 5;
-    string saved_version_fingerprint = 6;
-    Timestamp saved_mtime = 7;
+    repeated VectorClockEntry saved_version = 6;
+    string saved_version_fingerprint = 7;
+    Timestamp saved_mtime = 8;
 }
 
 message BufferChunk {