From 2fe5bf419b98a352bc98af5ee7607f3aa954986d Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Thu, 4 May 2023 13:26:53 -0700 Subject: [PATCH] Add proto fields for repository entry maintenance --- crates/collab/src/rpc.rs | 4 ++++ crates/project/src/worktree.rs | 16 ++++++++++++++++ crates/rpc/proto/zed.proto | 15 ++++++++++++--- crates/rpc/src/proto.rs | 8 ++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 16e7577d95..05c7d10982 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -1063,6 +1063,8 @@ async fn rejoin_room( removed_entries: worktree.removed_entries, scan_id: worktree.scan_id, is_last_update: worktree.completed_scan_id == worktree.scan_id, + //TODO repo + updated_repositories: vec![], }; for update in proto::split_worktree_update(message, MAX_CHUNK_SIZE) { session.peer.send(session.connection_id, update.clone())?; @@ -1383,6 +1385,8 @@ async fn join_project( removed_entries: Default::default(), scan_id: worktree.scan_id, is_last_update: worktree.scan_id == worktree.completed_scan_id, + // TODO repo + updated_repositories: vec![], }; for update in proto::split_worktree_update(message, MAX_CHUNK_SIZE) { session.peer.send(session.connection_id, update.clone())?; diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index b6de263d2a..3adb956be2 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -43,6 +43,7 @@ use std::{ future::Future, mem, ops::{Deref, DerefMut}, + os::unix::prelude::OsStrExt, path::{Path, PathBuf}, pin::Pin, sync::{ @@ -143,6 +144,18 @@ impl RepositoryEntry { } } +impl From<&RepositoryEntry> for proto::RepositoryEntry { + fn from(value: &RepositoryEntry) -> Self { + proto::RepositoryEntry { + git_dir_entry_id: value.git_dir_entry_id.to_proto(), + scan_id: value.scan_id as u64, + git_dir_path: value.git_dir_path.as_os_str().as_bytes().to_vec(), + work_directory: value.work_directory.0.as_os_str().as_bytes().to_vec(), + branch: value.branch.as_ref().map(|str| str.to_string()), + } + } +} + /// This path corresponds to the 'content path' (the folder that contains the .git) #[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq)] pub struct RepositoryWorkDirectory(Arc); @@ -1542,6 +1555,7 @@ impl LocalSnapshot { removed_entries: Default::default(), scan_id: self.scan_id as u64, is_last_update: true, + updated_repositories: self.repository_entries.values().map(Into::into).collect(), } } @@ -1610,6 +1624,8 @@ impl LocalSnapshot { removed_entries, scan_id: self.scan_id as u64, is_last_update: self.completed_scan_id == self.scan_id, + // TODO repo + updated_repositories: vec![], } } diff --git a/crates/rpc/proto/zed.proto b/crates/rpc/proto/zed.proto index ebb524e1a0..179452296b 100644 --- a/crates/rpc/proto/zed.proto +++ b/crates/rpc/proto/zed.proto @@ -329,9 +329,10 @@ message UpdateWorktree { string root_name = 3; repeated Entry updated_entries = 4; repeated uint64 removed_entries = 5; - uint64 scan_id = 6; - bool is_last_update = 7; - string abs_path = 8; + repeated RepositoryEntry updated_repositories = 6; + uint64 scan_id = 7; + bool is_last_update = 8; + string abs_path = 9; } message CreateProjectEntry { @@ -979,6 +980,14 @@ message Entry { bool is_ignored = 7; } +message RepositoryEntry { + uint64 git_dir_entry_id = 1; + uint64 scan_id = 2; + bytes git_dir_path = 3; + bytes work_directory = 4; + optional string branch = 5; +} + message BufferState { uint64 id = 1; optional File file = 2; diff --git a/crates/rpc/src/proto.rs b/crates/rpc/src/proto.rs index a27c6ac1bb..b410d0cb83 100644 --- a/crates/rpc/src/proto.rs +++ b/crates/rpc/src/proto.rs @@ -502,6 +502,13 @@ pub fn split_worktree_update( .drain(..removed_entries_chunk_size) .collect(); + let updated_repositories_chunk_size = + cmp::min(message.updated_repositories.len(), max_chunk_size); + let updated_repositories = message + .updated_repositories + .drain(..updated_repositories_chunk_size) + .collect(); + done = message.updated_entries.is_empty() && message.removed_entries.is_empty(); Some(UpdateWorktree { project_id: message.project_id, @@ -512,6 +519,7 @@ pub fn split_worktree_update( removed_entries, scan_id: message.scan_id, is_last_update: done && message.is_last_update, + updated_repositories, }) }) }