diff --git a/crates/agent_ui/src/acp/message_editor.rs b/crates/agent_ui/src/acp/message_editor.rs index 12ae893c317b9a5518b78fdc4c4d7ab7c315eba7..44403d5ffaceac466bff4c69d339e8194c6395fe 100644 --- a/crates/agent_ui/src/acp/message_editor.rs +++ b/crates/agent_ui/src/acp/message_editor.rs @@ -438,13 +438,16 @@ impl MessageEditor { let Some(entry) = self.project.read(cx).entry_for_path(&project_path, cx) else { return Task::ready(Err(anyhow!("project entry not found"))); }; - let Some(worktree) = self.project.read(cx).worktree_for_entry(entry.id, cx) else { + let directory_path = entry.path.clone(); + let Some(worktree) = self + .project + .read(cx) + .worktree_for_id(project_path.worktree_id, cx) + else { return Task::ready(Err(anyhow!("worktree not found"))); }; let project = self.project.clone(); cx.spawn(async move |_, cx| { - let directory_path = entry.path.clone(); - let worktree_id = worktree.read_with(cx, |worktree, _| worktree.id())?; let file_paths = worktree.read_with(cx, |worktree, _cx| { collect_files_in_path(worktree, &directory_path) diff --git a/crates/agent_ui/src/acp/thread_view.rs b/crates/agent_ui/src/acp/thread_view.rs index 837ce6f90ad7f2b445d91abeadc6658c3d348a0a..e4f6eaf5f693306b1ff8415ee6171d59d63b8a11 100644 --- a/crates/agent_ui/src/acp/thread_view.rs +++ b/crates/agent_ui/src/acp/thread_view.rs @@ -3772,15 +3772,15 @@ impl AcpThreadView { MentionUri::PastedImage => {} MentionUri::Directory { abs_path } => { let project = workspace.project(); - let Some(entry) = project.update(cx, |project, cx| { + let Some(entry_id) = project.update(cx, |project, cx| { let path = project.find_project_path(abs_path, cx)?; - project.entry_for_path(&path, cx) + project.entry_for_path(&path, cx).map(|entry| entry.id) }) else { return; }; project.update(cx, |_, cx| { - cx.emit(project::Event::RevealInProjectPanel(entry.id)); + cx.emit(project::Event::RevealInProjectPanel(entry_id)); }); } MentionUri::Symbol { @@ -3793,11 +3793,9 @@ impl AcpThreadView { line_range, } => { let project = workspace.project(); - let Some((path, _)) = project.update(cx, |project, cx| { - let path = project.find_project_path(path, cx)?; - let entry = project.entry_for_path(&path, cx)?; - Some((path, entry)) - }) else { + let Some(path) = + project.update(cx, |project, cx| project.find_project_path(path, cx)) + else { return; }; diff --git a/crates/agent_ui/src/context_picker.rs b/crates/agent_ui/src/context_picker.rs index 405b5ed90ba1606ef97b8b048b959bfc354bc5cd..b225fbf34058604cfb3f306a9cee14f69bb5edaa 100644 --- a/crates/agent_ui/src/context_picker.rs +++ b/crates/agent_ui/src/context_picker.rs @@ -987,7 +987,8 @@ impl MentionLink { .read(cx) .project() .read(cx) - .entry_for_path(&project_path, cx)?; + .entry_for_path(&project_path, cx)? + .clone(); Some(MentionLink::File(project_path, entry)) } Self::SYMBOL => { diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 9fd4eed641a17bf317c7d69ef0afa0802c8ae276..9a1e9cd94d08f88b887af0cfb531d18cf55827fa 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -4297,7 +4297,7 @@ impl Project { self.active_entry } - pub fn entry_for_path(&self, path: &ProjectPath, cx: &App) -> Option { + pub fn entry_for_path<'a>(&'a self, path: &ProjectPath, cx: &'a App) -> Option<&'a Entry> { self.worktree_store.read(cx).entry_for_path(path, cx) } diff --git a/crates/project/src/worktree_store.rs b/crates/project/src/worktree_store.rs index b8905c73bc66ab3f9a911785fe812401dfdb6ee4..7dd0274facc92ebe3f7d135489ddafd89ce6e1fa 100644 --- a/crates/project/src/worktree_store.rs +++ b/crates/project/src/worktree_store.rs @@ -203,11 +203,10 @@ impl WorktreeStore { }) } - pub fn entry_for_path(&self, path: &ProjectPath, cx: &App) -> Option { + pub fn entry_for_path<'a>(&'a self, path: &ProjectPath, cx: &'a App) -> Option<&'a Entry> { self.worktree_for_id(path.worktree_id, cx)? .read(cx) .entry_for_path(&path.path) - .cloned() } pub fn create_worktree( diff --git a/crates/repl/src/notebook/notebook_ui.rs b/crates/repl/src/notebook/notebook_ui.rs index 325d262d9eddc164093f088d0e4790d0fa581167..081c474cdad86a5340520ef09345bd456f55b5ba 100644 --- a/crates/repl/src/notebook/notebook_ui.rs +++ b/crates/repl/src/notebook/notebook_ui.rs @@ -594,9 +594,10 @@ impl project::ProjectItem for NotebookItem { }; let id = project - .update(cx, |project, cx| project.entry_for_path(&path, cx))? - .context("Entry not found")? - .id; + .update(cx, |project, cx| { + project.entry_for_path(&path, cx).map(|entry| entry.id) + })? + .context("Entry not found")?; cx.new(|_| NotebookItem { path: abs_path, diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index 8ac12588afa2acf75aba1091407bd6f8b83d51ce..5d67e1047f39d90677274af42c9d66fa898b8679 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -3187,6 +3187,7 @@ pub mod tests { .read(cx) .entry_for_path(&(worktree_id, "a").into(), cx) .expect("no entry for /a/ directory") + .clone() }); assert!(a_dir_entry.is_dir()); window