Fix project entry rename in Remote Development (#23382)
Closes #22883 To fix the problem, we move `handle_rename_project_entry` from `Worktree` to `LspStore` and register it there. This way it becomes available both in local and headless projects and this avoids the duplication. Release Notes: - Fixed renaming project entries in Remote Development
This commit is contained in:
parent
cc1af7d96b
commit
d40177c2ae
4 changed files with 88 additions and 56 deletions
|
@ -2872,6 +2872,7 @@ impl LspStore {
|
||||||
client.add_model_request_handler(Self::handle_on_type_formatting);
|
client.add_model_request_handler(Self::handle_on_type_formatting);
|
||||||
client.add_model_request_handler(Self::handle_apply_additional_edits_for_completion);
|
client.add_model_request_handler(Self::handle_apply_additional_edits_for_completion);
|
||||||
client.add_model_request_handler(Self::handle_register_buffer_with_language_servers);
|
client.add_model_request_handler(Self::handle_register_buffer_with_language_servers);
|
||||||
|
client.add_model_request_handler(Self::handle_rename_project_entry);
|
||||||
client.add_model_request_handler(Self::handle_lsp_command::<GetCodeActions>);
|
client.add_model_request_handler(Self::handle_lsp_command::<GetCodeActions>);
|
||||||
client.add_model_request_handler(Self::handle_lsp_command::<GetCompletions>);
|
client.add_model_request_handler(Self::handle_lsp_command::<GetCompletions>);
|
||||||
client.add_model_request_handler(Self::handle_lsp_command::<GetHover>);
|
client.add_model_request_handler(Self::handle_lsp_command::<GetHover>);
|
||||||
|
@ -5928,6 +5929,52 @@ impl LspStore {
|
||||||
Ok(proto::Ack {})
|
Ok(proto::Ack {})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn handle_rename_project_entry(
|
||||||
|
this: Model<Self>,
|
||||||
|
envelope: TypedEnvelope<proto::RenameProjectEntry>,
|
||||||
|
mut cx: AsyncAppContext,
|
||||||
|
) -> Result<proto::ProjectEntryResponse> {
|
||||||
|
let entry_id = ProjectEntryId::from_proto(envelope.payload.entry_id);
|
||||||
|
let (worktree_id, worktree, old_path, is_dir) = this
|
||||||
|
.update(&mut cx, |this, cx| {
|
||||||
|
this.worktree_store
|
||||||
|
.read(cx)
|
||||||
|
.worktree_and_entry_for_id(entry_id, cx)
|
||||||
|
.map(|(worktree, entry)| {
|
||||||
|
(
|
||||||
|
worktree.read(cx).id(),
|
||||||
|
worktree,
|
||||||
|
entry.path.clone(),
|
||||||
|
entry.is_dir(),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})?
|
||||||
|
.ok_or_else(|| anyhow!("worktree not found"))?;
|
||||||
|
let (old_abs_path, new_abs_path) = {
|
||||||
|
let root_path = worktree.update(&mut cx, |this, _| this.abs_path())?;
|
||||||
|
(
|
||||||
|
root_path.join(&old_path),
|
||||||
|
root_path.join(&envelope.payload.new_path),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
Self::will_rename_entry(
|
||||||
|
this.downgrade(),
|
||||||
|
worktree_id,
|
||||||
|
&old_abs_path,
|
||||||
|
&new_abs_path,
|
||||||
|
is_dir,
|
||||||
|
cx.clone(),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
let response = Worktree::handle_rename_entry(worktree, envelope.payload, cx.clone()).await;
|
||||||
|
this.update(&mut cx, |this, _| {
|
||||||
|
this.did_rename_entry(worktree_id, &old_abs_path, &new_abs_path, is_dir);
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
response
|
||||||
|
}
|
||||||
|
|
||||||
async fn handle_update_diagnostic_summary(
|
async fn handle_update_diagnostic_summary(
|
||||||
this: Model<Self>,
|
this: Model<Self>,
|
||||||
envelope: TypedEnvelope<proto::UpdateDiagnosticSummary>,
|
envelope: TypedEnvelope<proto::UpdateDiagnosticSummary>,
|
||||||
|
|
|
@ -602,8 +602,6 @@ impl Project {
|
||||||
client.add_model_request_handler(Self::handle_open_new_buffer);
|
client.add_model_request_handler(Self::handle_open_new_buffer);
|
||||||
client.add_model_message_handler(Self::handle_create_buffer_for_peer);
|
client.add_model_message_handler(Self::handle_create_buffer_for_peer);
|
||||||
|
|
||||||
client.add_model_request_handler(WorktreeStore::handle_rename_project_entry);
|
|
||||||
|
|
||||||
WorktreeStore::init(&client);
|
WorktreeStore::init(&client);
|
||||||
BufferStore::init(&client);
|
BufferStore::init(&client);
|
||||||
LspStore::init(&client);
|
LspStore::init(&client);
|
||||||
|
|
|
@ -27,7 +27,7 @@ use text::ReplicaId;
|
||||||
use util::{paths::SanitizedPath, ResultExt};
|
use util::{paths::SanitizedPath, ResultExt};
|
||||||
use worktree::{Entry, ProjectEntryId, Worktree, WorktreeId, WorktreeSettings};
|
use worktree::{Entry, ProjectEntryId, Worktree, WorktreeId, WorktreeSettings};
|
||||||
|
|
||||||
use crate::{search::SearchQuery, LspStore, ProjectPath};
|
use crate::{search::SearchQuery, ProjectPath};
|
||||||
|
|
||||||
struct MatchingEntry {
|
struct MatchingEntry {
|
||||||
worktree_path: Arc<Path>,
|
worktree_path: Arc<Path>,
|
||||||
|
@ -1018,59 +1018,6 @@ impl WorktreeStore {
|
||||||
Worktree::handle_create_entry(worktree, envelope.payload, cx).await
|
Worktree::handle_create_entry(worktree, envelope.payload, cx).await
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn handle_rename_project_entry(
|
|
||||||
this: Model<super::Project>,
|
|
||||||
envelope: TypedEnvelope<proto::RenameProjectEntry>,
|
|
||||||
mut cx: AsyncAppContext,
|
|
||||||
) -> Result<proto::ProjectEntryResponse> {
|
|
||||||
let entry_id = ProjectEntryId::from_proto(envelope.payload.entry_id);
|
|
||||||
let (worktree_id, worktree, old_path, is_dir) = this
|
|
||||||
.update(&mut cx, |this, cx| {
|
|
||||||
this.worktree_store
|
|
||||||
.read(cx)
|
|
||||||
.worktree_and_entry_for_id(entry_id, cx)
|
|
||||||
.map(|(worktree, entry)| {
|
|
||||||
(
|
|
||||||
worktree.read(cx).id(),
|
|
||||||
worktree,
|
|
||||||
entry.path.clone(),
|
|
||||||
entry.is_dir(),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})?
|
|
||||||
.ok_or_else(|| anyhow!("worktree not found"))?;
|
|
||||||
let (old_abs_path, new_abs_path) = {
|
|
||||||
let root_path = worktree.update(&mut cx, |this, _| this.abs_path())?;
|
|
||||||
(
|
|
||||||
root_path.join(&old_path),
|
|
||||||
root_path.join(&envelope.payload.new_path),
|
|
||||||
)
|
|
||||||
};
|
|
||||||
let lsp_store = this
|
|
||||||
.update(&mut cx, |this, _| this.lsp_store())?
|
|
||||||
.downgrade();
|
|
||||||
LspStore::will_rename_entry(
|
|
||||||
lsp_store,
|
|
||||||
worktree_id,
|
|
||||||
&old_abs_path,
|
|
||||||
&new_abs_path,
|
|
||||||
is_dir,
|
|
||||||
cx.clone(),
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
let response = Worktree::handle_rename_entry(worktree, envelope.payload, cx.clone()).await;
|
|
||||||
this.update(&mut cx, |this, cx| {
|
|
||||||
this.lsp_store().read(cx).did_rename_entry(
|
|
||||||
worktree_id,
|
|
||||||
&old_abs_path,
|
|
||||||
&new_abs_path,
|
|
||||||
is_dir,
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.ok();
|
|
||||||
response
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn handle_copy_project_entry(
|
pub async fn handle_copy_project_entry(
|
||||||
this: Model<Self>,
|
this: Model<Self>,
|
||||||
envelope: TypedEnvelope<proto::CopyProjectEntry>,
|
envelope: TypedEnvelope<proto::CopyProjectEntry>,
|
||||||
|
|
|
@ -1135,6 +1135,46 @@ async fn test_remote_root_rename(cx: &mut TestAppContext, server_cx: &mut TestAp
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
async fn test_remote_rename_entry(cx: &mut TestAppContext, server_cx: &mut TestAppContext) {
|
||||||
|
let fs = FakeFs::new(server_cx.executor());
|
||||||
|
fs.insert_tree(
|
||||||
|
"/code",
|
||||||
|
json!({
|
||||||
|
"project1": {
|
||||||
|
".git": {},
|
||||||
|
"README.md": "# project 1",
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
let (project, _) = init_test(&fs, cx, server_cx).await;
|
||||||
|
let (worktree, _) = project
|
||||||
|
.update(cx, |project, cx| {
|
||||||
|
project.find_or_create_worktree("/code/project1", true, cx)
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
cx.run_until_parked();
|
||||||
|
|
||||||
|
let entry = worktree
|
||||||
|
.update(cx, |worktree, cx| {
|
||||||
|
let entry = worktree.entry_for_path("README.md").unwrap();
|
||||||
|
worktree.rename_entry(entry.id, Path::new("README.rst"), cx)
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.to_included()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
cx.run_until_parked();
|
||||||
|
|
||||||
|
worktree.update(cx, |worktree, _| {
|
||||||
|
assert_eq!(worktree.entry_for_path("README.rst").unwrap().id, entry.id)
|
||||||
|
});
|
||||||
|
}
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
async fn test_remote_git_branches(cx: &mut TestAppContext, server_cx: &mut TestAppContext) {
|
async fn test_remote_git_branches(cx: &mut TestAppContext, server_cx: &mut TestAppContext) {
|
||||||
let fs = FakeFs::new(server_cx.executor());
|
let fs = FakeFs::new(server_cx.executor());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue