This commit is contained in:
Antonio Scandurra
2021-06-18 19:28:39 +02:00
parent 89d25458ac
commit f9d8e952f2
5 changed files with 76 additions and 17 deletions
+19 -2
View File
@@ -11,8 +11,11 @@ message Envelope {
ShareWorktreeResponse share_worktree_response = 6;
OpenWorktree open_worktree = 7;
OpenWorktreeResponse open_worktree_response = 8;
OpenBuffer open_buffer = 9;
OpenBufferResponse open_buffer_response = 10;
OpenFile open_file = 9;
OpenFileResponse open_file_response = 10;
CloseFile close_file = 11;
OpenBuffer open_buffer = 12;
OpenBufferResponse open_buffer_response = 13;
}
}
@@ -43,6 +46,20 @@ message OpenWorktreeResponse {
Worktree worktree = 1;
}
message OpenFile {
uint64 worktree_id = 1;
string path = 2;
}
message OpenFileResponse {
uint64 id = 1;
uint64 mtime = 2;
}
message CloseFile {
uint64 id = 1;
}
message OpenBuffer {
uint64 worktree_id = 1;
string path = 2;
+2
View File
@@ -56,6 +56,8 @@ macro_rules! request_message {
request_message!(Auth, AuthResponse);
request_message!(ShareWorktree, ShareWorktreeResponse);
request_message!(OpenWorktree, OpenWorktreeResponse);
request_message!(OpenFile, OpenFileResponse);
message!(CloseFile);
request_message!(OpenBuffer, OpenBufferResponse);
/// A stream of protobuf messages.
+3 -1
View File
@@ -729,7 +729,9 @@ impl Workspace {
.worktree
.ok_or_else(|| anyhow!("empty worktree"))?;
this.update(&mut cx, |workspace, cx| {
let worktree = cx.add_model(|cx| Worktree::remote(worktree, cx));
let worktree = cx.add_model(|cx| {
Worktree::remote(worktree_id, worktree, rpc, connection_id, cx)
});
cx.observe_model(&worktree, |_, _, cx| cx.notify());
workspace.worktrees.insert(worktree);
cx.notify();
+51 -13
View File
@@ -60,8 +60,14 @@ impl Worktree {
Worktree::Local(LocalWorktree::new(path, cx))
}
pub fn remote(worktree: proto::Worktree, cx: &mut ModelContext<Worktree>) -> Self {
Worktree::Remote(RemoteWorktree::new(worktree, cx))
pub fn remote(
id: u64,
worktree: proto::Worktree,
rpc: rpc::Client,
connection_id: ConnectionId,
cx: &mut ModelContext<Worktree>,
) -> Self {
Worktree::Remote(RemoteWorktree::new(id, worktree, rpc, connection_id, cx))
}
pub fn as_local(&self) -> Option<&LocalWorktree> {
@@ -149,7 +155,7 @@ impl LocalWorktree {
fn new(path: impl Into<Arc<Path>>, cx: &mut ModelContext<Worktree>) -> Self {
let abs_path = path.into();
let (scan_state_tx, scan_state_rx) = smol::channel::unbounded();
let id = cx.model_id();
let id = cx.model_id() as u64;
let snapshot = Snapshot {
id,
scan_id: 0,
@@ -368,12 +374,21 @@ impl fmt::Debug for LocalWorktree {
}
pub struct RemoteWorktree {
id: u64,
snapshot: Snapshot,
handles: Arc<Mutex<HashMap<Arc<Path>, Weak<Mutex<FileHandleState>>>>>,
rpc: rpc::Client,
connection_id: ConnectionId,
}
impl RemoteWorktree {
fn new(worktree: proto::Worktree, cx: &mut ModelContext<Worktree>) -> Self {
let id = cx.model_id();
fn new(
id: u64,
worktree: proto::Worktree,
rpc: rpc::Client,
connection_id: ConnectionId,
cx: &mut ModelContext<Worktree>,
) -> Self {
let root_char_bag: CharBag = worktree
.root_name
.chars()
@@ -407,13 +422,19 @@ impl RemoteWorktree {
ignores: Default::default(),
entries,
};
Self { snapshot }
Self {
id,
snapshot,
handles: Default::default(),
rpc,
connection_id,
}
}
}
#[derive(Clone)]
pub struct Snapshot {
id: usize,
id: u64,
scan_id: usize,
abs_path: Arc<Path>,
root_name: String,
@@ -850,7 +871,7 @@ impl BackgroundScanner {
snapshot: Arc<Mutex<Snapshot>>,
handles: Arc<Mutex<HashMap<Arc<Path>, Weak<Mutex<FileHandleState>>>>>,
notify: Sender<ScanState>,
worktree_id: usize,
worktree_id: u64,
) -> Self {
let mut scanner = Self {
root_char_bag: Default::default(),
@@ -1370,7 +1391,7 @@ struct UpdateIgnoreStatusJob {
}
pub trait WorktreeHandle {
fn file(&self, path: impl AsRef<Path>, cx: &mut MutableAppContext) -> Task<FileHandle>;
fn file(&self, path: impl AsRef<Path>, cx: &mut MutableAppContext) -> Task<Result<FileHandle>>;
#[cfg(test)]
fn flush_fs_events<'a>(
@@ -1380,7 +1401,7 @@ pub trait WorktreeHandle {
}
impl WorktreeHandle for ModelHandle<Worktree> {
fn file(&self, path: impl AsRef<Path>, cx: &mut MutableAppContext) -> Task<FileHandle> {
fn file(&self, path: impl AsRef<Path>, cx: &mut MutableAppContext) -> Task<Result<FileHandle>> {
let path = Arc::from(path.as_ref());
let handle = self.clone();
let tree = self.read(cx);
@@ -1422,13 +1443,30 @@ impl WorktreeHandle for ModelHandle<Worktree> {
state
}
});
FileHandle {
Ok(FileHandle {
worktree: handle.clone(),
state,
}
})
})
}
Worktree::Remote(tree) => {
let worktree_id = tree.id;
let connection_id = tree.connection_id;
let rpc = tree.rpc.clone();
cx.spawn(|cx| async move {
let response = rpc
.request(
connection_id,
proto::OpenFile {
worktree_id,
path: path.to_string_lossy().to_string(),
},
)
.await?;
todo!()
})
}
Worktree::Remote(tree) => todo!(),
}
}
+1 -1
View File
@@ -22,7 +22,7 @@ pub struct MatchCandidate<'a> {
pub struct PathMatch {
pub score: f64,
pub positions: Vec<usize>,
pub tree_id: usize,
pub tree_id: u64,
pub path: Arc<Path>,
pub include_root_name: bool,
}