project: Be explicit about project-searchability for buffers (#37773)
Closes https://github.com/zed-industries/zed/issues/28830 Release Notes: - Fixed builtin buffers and log views showing up in project search
This commit is contained in:
@@ -212,7 +212,8 @@ impl ActivityIndicator {
|
||||
server_name,
|
||||
status,
|
||||
} => {
|
||||
let create_buffer = project.update(cx, |project, cx| project.create_buffer(cx));
|
||||
let create_buffer =
|
||||
project.update(cx, |project, cx| project.create_buffer(false, cx));
|
||||
let status = status.clone();
|
||||
let server_name = server_name.clone();
|
||||
cx.spawn_in(window, async move |workspace, cx| {
|
||||
|
||||
@@ -4255,7 +4255,7 @@ impl AcpThreadView {
|
||||
}
|
||||
|
||||
let buffer = project.update(cx, |project, cx| {
|
||||
project.create_local_buffer(&markdown, Some(markdown_language), cx)
|
||||
project.create_local_buffer(&markdown, Some(markdown_language), true, cx)
|
||||
});
|
||||
let buffer = cx.new(|cx| {
|
||||
MultiBuffer::singleton(buffer, cx).with_title(thread_summary.clone())
|
||||
|
||||
@@ -3585,7 +3585,7 @@ pub(crate) fn open_active_thread_as_markdown(
|
||||
}
|
||||
|
||||
let buffer = project.update(cx, |project, cx| {
|
||||
project.create_local_buffer(&markdown, Some(markdown_language), cx)
|
||||
project.create_local_buffer(&markdown, Some(markdown_language), true, cx)
|
||||
});
|
||||
let buffer =
|
||||
cx.new(|cx| MultiBuffer::singleton(buffer, cx).with_title(thread_summary.clone()));
|
||||
|
||||
@@ -88,10 +88,7 @@ fn view_release_notes_locally(
|
||||
.update_in(cx, |workspace, window, cx| {
|
||||
let project = workspace.project().clone();
|
||||
let buffer = project.update(cx, |project, cx| {
|
||||
let buffer = project.create_local_buffer("", markdown, cx);
|
||||
project
|
||||
.mark_buffer_as_non_searchable(buffer.read(cx).remote_id(), cx);
|
||||
buffer
|
||||
project.create_local_buffer("", markdown, false, cx)
|
||||
});
|
||||
buffer.update(cx, |buffer, cx| {
|
||||
buffer.edit([(0..0, body.release_notes)], None, cx)
|
||||
|
||||
@@ -2098,7 +2098,7 @@ async fn test_following_after_replacement(cx_a: &mut TestAppContext, cx_b: &mut
|
||||
share_workspace(&workspace, cx_a).await.unwrap();
|
||||
let buffer = workspace.update(cx_a, |workspace, cx| {
|
||||
workspace.project().update(cx, |project, cx| {
|
||||
project.create_local_buffer(&sample_text(26, 5, 'a'), None, cx)
|
||||
project.create_local_buffer(&sample_text(26, 5, 'a'), None, false, cx)
|
||||
})
|
||||
});
|
||||
let multibuffer = cx_a.new(|cx| {
|
||||
|
||||
@@ -2506,7 +2506,7 @@ async fn test_propagate_saves_and_fs_changes(
|
||||
});
|
||||
|
||||
let new_buffer_a = project_a
|
||||
.update(cx_a, |p, cx| p.create_buffer(cx))
|
||||
.update(cx_a, |p, cx| p.create_buffer(false, cx))
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
|
||||
@@ -2619,7 +2619,7 @@ impl Editor {
|
||||
cx: &mut Context<Workspace>,
|
||||
) -> Task<Result<Entity<Editor>>> {
|
||||
let project = workspace.project().clone();
|
||||
let create = project.update(cx, |project, cx| project.create_buffer(cx));
|
||||
let create = project.update(cx, |project, cx| project.create_buffer(true, cx));
|
||||
|
||||
cx.spawn_in(window, async move |workspace, cx| {
|
||||
let buffer = create.await?;
|
||||
@@ -2657,7 +2657,7 @@ impl Editor {
|
||||
cx: &mut Context<Workspace>,
|
||||
) {
|
||||
let project = workspace.project().clone();
|
||||
let create = project.update(cx, |project, cx| project.create_buffer(cx));
|
||||
let create = project.update(cx, |project, cx| project.create_buffer(true, cx));
|
||||
|
||||
cx.spawn_in(window, async move |workspace, cx| {
|
||||
let buffer = create.await?;
|
||||
|
||||
@@ -15913,7 +15913,7 @@ async fn test_following(cx: &mut TestAppContext) {
|
||||
let project = Project::test(fs, ["/file.rs".as_ref()], cx).await;
|
||||
|
||||
let buffer = project.update(cx, |project, cx| {
|
||||
let buffer = project.create_local_buffer(&sample_text(16, 8, 'a'), None, cx);
|
||||
let buffer = project.create_local_buffer(&sample_text(16, 8, 'a'), None, false, cx);
|
||||
cx.new(|cx| MultiBuffer::singleton(buffer, cx))
|
||||
});
|
||||
let leader = cx.add_window(|window, cx| build_editor(buffer.clone(), window, cx));
|
||||
@@ -16165,8 +16165,8 @@ async fn test_following_with_multiple_excerpts(cx: &mut TestAppContext) {
|
||||
|
||||
let (buffer_1, buffer_2) = project.update(cx, |project, cx| {
|
||||
(
|
||||
project.create_local_buffer("abc\ndef\nghi\njkl\n", None, cx),
|
||||
project.create_local_buffer("mno\npqr\nstu\nvwx\n", None, cx),
|
||||
project.create_local_buffer("abc\ndef\nghi\njkl\n", None, false, cx),
|
||||
project.create_local_buffer("mno\npqr\nstu\nvwx\n", None, false, cx),
|
||||
)
|
||||
});
|
||||
|
||||
|
||||
@@ -1130,7 +1130,7 @@ impl SerializableItem for Editor {
|
||||
|
||||
// First create the empty buffer
|
||||
let buffer = project
|
||||
.update(cx, |project, cx| project.create_buffer(cx))?
|
||||
.update(cx, |project, cx| project.create_buffer(true, cx))?
|
||||
.await?;
|
||||
|
||||
// Then set the text so that the dirty bit is set correctly
|
||||
@@ -1238,7 +1238,7 @@ impl SerializableItem for Editor {
|
||||
..
|
||||
} => window.spawn(cx, async move |cx| {
|
||||
let buffer = project
|
||||
.update(cx, |project, cx| project.create_buffer(cx))?
|
||||
.update(cx, |project, cx| project.create_buffer(true, cx))?
|
||||
.await?;
|
||||
|
||||
cx.update(|window, cx| {
|
||||
|
||||
@@ -200,7 +200,7 @@ pub fn expand_macro_recursively(
|
||||
}
|
||||
|
||||
let buffer = project
|
||||
.update(cx, |project, cx| project.create_buffer(cx))?
|
||||
.update(cx, |project, cx| project.create_buffer(false, cx))?
|
||||
.await?;
|
||||
workspace.update_in(cx, |workspace, window, cx| {
|
||||
buffer.update(cx, |buffer, cx| {
|
||||
|
||||
@@ -388,9 +388,6 @@ pub(crate) fn commit_message_editor(
|
||||
window: &mut Window,
|
||||
cx: &mut Context<Editor>,
|
||||
) -> Editor {
|
||||
project.update(cx, |this, cx| {
|
||||
this.mark_buffer_as_non_searchable(commit_message_buffer.read(cx).remote_id(), cx);
|
||||
});
|
||||
let buffer = cx.new(|cx| MultiBuffer::singleton(commit_message_buffer, cx));
|
||||
let max_lines = if in_panel { MAX_PANEL_EDITOR_LINES } else { 18 };
|
||||
let mut commit_editor = Editor::new(
|
||||
|
||||
@@ -296,7 +296,7 @@ impl LanguageServerState {
|
||||
.update(cx, |workspace, cx| {
|
||||
workspace
|
||||
.project()
|
||||
.update(cx, |project, cx| project.create_buffer(cx))
|
||||
.update(cx, |project, cx| project.create_buffer(false, cx))
|
||||
})
|
||||
.ok()
|
||||
else {
|
||||
|
||||
@@ -319,7 +319,11 @@ impl RemoteBufferStore {
|
||||
})
|
||||
}
|
||||
|
||||
fn create_buffer(&self, cx: &mut Context<BufferStore>) -> Task<Result<Entity<Buffer>>> {
|
||||
fn create_buffer(
|
||||
&self,
|
||||
project_searchable: bool,
|
||||
cx: &mut Context<BufferStore>,
|
||||
) -> Task<Result<Entity<Buffer>>> {
|
||||
let create = self.upstream_client.request(proto::OpenNewBuffer {
|
||||
project_id: self.project_id,
|
||||
});
|
||||
@@ -327,8 +331,13 @@ impl RemoteBufferStore {
|
||||
let response = create.await?;
|
||||
let buffer_id = BufferId::new(response.buffer_id)?;
|
||||
|
||||
this.update(cx, |this, cx| this.wait_for_remote_buffer(buffer_id, cx))?
|
||||
.await
|
||||
this.update(cx, |this, cx| {
|
||||
if !project_searchable {
|
||||
this.non_searchable_buffers.insert(buffer_id);
|
||||
}
|
||||
this.wait_for_remote_buffer(buffer_id, cx)
|
||||
})?
|
||||
.await
|
||||
})
|
||||
}
|
||||
|
||||
@@ -670,12 +679,21 @@ impl LocalBufferStore {
|
||||
})
|
||||
}
|
||||
|
||||
fn create_buffer(&self, cx: &mut Context<BufferStore>) -> Task<Result<Entity<Buffer>>> {
|
||||
fn create_buffer(
|
||||
&self,
|
||||
project_searchable: bool,
|
||||
cx: &mut Context<BufferStore>,
|
||||
) -> Task<Result<Entity<Buffer>>> {
|
||||
cx.spawn(async move |buffer_store, cx| {
|
||||
let buffer =
|
||||
cx.new(|cx| Buffer::local("", cx).with_language(language::PLAIN_TEXT.clone(), cx))?;
|
||||
buffer_store.update(cx, |buffer_store, cx| {
|
||||
buffer_store.add_buffer(buffer.clone(), cx).log_err();
|
||||
if !project_searchable {
|
||||
buffer_store
|
||||
.non_searchable_buffers
|
||||
.insert(buffer.read(cx).remote_id());
|
||||
}
|
||||
})?;
|
||||
Ok(buffer)
|
||||
})
|
||||
@@ -848,10 +866,14 @@ impl BufferStore {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn create_buffer(&mut self, cx: &mut Context<Self>) -> Task<Result<Entity<Buffer>>> {
|
||||
pub fn create_buffer(
|
||||
&mut self,
|
||||
project_searchable: bool,
|
||||
cx: &mut Context<Self>,
|
||||
) -> Task<Result<Entity<Buffer>>> {
|
||||
match &self.state {
|
||||
BufferStoreState::Local(this) => this.create_buffer(cx),
|
||||
BufferStoreState::Remote(this) => this.create_buffer(cx),
|
||||
BufferStoreState::Local(this) => this.create_buffer(project_searchable, cx),
|
||||
BufferStoreState::Remote(this) => this.create_buffer(project_searchable, cx),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1610,6 +1632,7 @@ impl BufferStore {
|
||||
&mut self,
|
||||
text: &str,
|
||||
language: Option<Arc<Language>>,
|
||||
project_searchable: bool,
|
||||
cx: &mut Context<Self>,
|
||||
) -> Entity<Buffer> {
|
||||
let buffer = cx.new(|cx| {
|
||||
@@ -1619,6 +1642,9 @@ impl BufferStore {
|
||||
|
||||
self.add_buffer(buffer.clone(), cx).log_err();
|
||||
let buffer_id = buffer.read(cx).remote_id();
|
||||
if !project_searchable {
|
||||
self.non_searchable_buffers.insert(buffer_id);
|
||||
}
|
||||
|
||||
if let Some(file) = File::from_dyn(buffer.read(cx).file()) {
|
||||
self.path_to_buffer_id.insert(
|
||||
@@ -1688,10 +1714,6 @@ impl BufferStore {
|
||||
}
|
||||
serialized_transaction
|
||||
}
|
||||
|
||||
pub(crate) fn mark_buffer_as_non_searchable(&mut self, buffer_id: BufferId) {
|
||||
self.non_searchable_buffers.insert(buffer_id);
|
||||
}
|
||||
}
|
||||
|
||||
impl OpenBuffer {
|
||||
|
||||
@@ -3317,7 +3317,7 @@ impl Repository {
|
||||
) -> Task<Result<Entity<Buffer>>> {
|
||||
cx.spawn(async move |repository, cx| {
|
||||
let buffer = buffer_store
|
||||
.update(cx, |buffer_store, cx| buffer_store.create_buffer(cx))?
|
||||
.update(cx, |buffer_store, cx| buffer_store.create_buffer(false, cx))?
|
||||
.await?;
|
||||
|
||||
if let Some(language_registry) = language_registry {
|
||||
|
||||
@@ -2540,22 +2540,28 @@ impl Project {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_buffer(&mut self, cx: &mut Context<Self>) -> Task<Result<Entity<Buffer>>> {
|
||||
self.buffer_store
|
||||
.update(cx, |buffer_store, cx| buffer_store.create_buffer(cx))
|
||||
pub fn create_buffer(
|
||||
&mut self,
|
||||
searchable: bool,
|
||||
cx: &mut Context<Self>,
|
||||
) -> Task<Result<Entity<Buffer>>> {
|
||||
self.buffer_store.update(cx, |buffer_store, cx| {
|
||||
buffer_store.create_buffer(searchable, cx)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn create_local_buffer(
|
||||
&mut self,
|
||||
text: &str,
|
||||
language: Option<Arc<Language>>,
|
||||
project_searchable: bool,
|
||||
cx: &mut Context<Self>,
|
||||
) -> Entity<Buffer> {
|
||||
if self.is_via_collab() || self.is_via_remote_server() {
|
||||
panic!("called create_local_buffer on a remote project")
|
||||
}
|
||||
self.buffer_store.update(cx, |buffer_store, cx| {
|
||||
buffer_store.create_local_buffer(text, language, cx)
|
||||
buffer_store.create_local_buffer(text, language, project_searchable, cx)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -4913,7 +4919,7 @@ impl Project {
|
||||
mut cx: AsyncApp,
|
||||
) -> Result<proto::OpenBufferResponse> {
|
||||
let buffer = this
|
||||
.update(&mut cx, |this, cx| this.create_buffer(cx))?
|
||||
.update(&mut cx, |this, cx| this.create_buffer(true, cx))?
|
||||
.await?;
|
||||
let peer_id = envelope.original_sender_id()?;
|
||||
|
||||
@@ -5244,12 +5250,6 @@ impl Project {
|
||||
pub fn agent_location(&self) -> Option<AgentLocation> {
|
||||
self.agent_location.clone()
|
||||
}
|
||||
|
||||
pub fn mark_buffer_as_non_searchable(&self, buffer_id: BufferId, cx: &mut Context<Project>) {
|
||||
self.buffer_store.update(cx, |buffer_store, _| {
|
||||
buffer_store.mark_buffer_as_non_searchable(buffer_id)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
pub struct PathMatchCandidateSet {
|
||||
|
||||
@@ -3876,7 +3876,7 @@ async fn test_save_file_spawns_language_server(cx: &mut gpui::TestAppContext) {
|
||||
);
|
||||
|
||||
let buffer = project
|
||||
.update(cx, |this, cx| this.create_buffer(cx))
|
||||
.update(cx, |this, cx| this.create_buffer(false, cx))
|
||||
.unwrap()
|
||||
.await;
|
||||
project.update(cx, |this, cx| {
|
||||
@@ -4088,7 +4088,9 @@ async fn test_save_as(cx: &mut gpui::TestAppContext) {
|
||||
let languages = project.update(cx, |project, _| project.languages().clone());
|
||||
languages.add(rust_lang());
|
||||
|
||||
let buffer = project.update(cx, |project, cx| project.create_local_buffer("", None, cx));
|
||||
let buffer = project.update(cx, |project, cx| {
|
||||
project.create_local_buffer("", None, false, cx)
|
||||
});
|
||||
buffer.update(cx, |buffer, cx| {
|
||||
buffer.edit([(0..0, "abc")], None, cx);
|
||||
assert!(buffer.is_dirty());
|
||||
@@ -5585,9 +5587,7 @@ async fn test_search_with_buffer_exclusions(cx: &mut gpui::TestAppContext) {
|
||||
|
||||
let project = Project::test(fs.clone(), [path!("/dir").as_ref()], cx).await;
|
||||
let _buffer = project.update(cx, |project, cx| {
|
||||
let buffer = project.create_local_buffer("file", None, cx);
|
||||
project.mark_buffer_as_non_searchable(buffer.read(cx).remote_id(), cx);
|
||||
buffer
|
||||
project.create_local_buffer("file", None, false, cx)
|
||||
});
|
||||
|
||||
assert_eq!(
|
||||
|
||||
@@ -517,7 +517,7 @@ impl HeadlessProject {
|
||||
let buffer_store = this.buffer_store.clone();
|
||||
let buffer = this
|
||||
.buffer_store
|
||||
.update(cx, |buffer_store, cx| buffer_store.create_buffer(cx));
|
||||
.update(cx, |buffer_store, cx| buffer_store.create_buffer(true, cx));
|
||||
anyhow::Ok((buffer_store, buffer))
|
||||
})??;
|
||||
|
||||
|
||||
@@ -1167,7 +1167,7 @@ fn open_log_file(workspace: &mut Workspace, window: &mut Window, cx: &mut Contex
|
||||
};
|
||||
let project = workspace.project().clone();
|
||||
let buffer = project.update(cx, |project, cx| {
|
||||
project.create_local_buffer(&log, None, cx)
|
||||
project.create_local_buffer(&log, None, false, cx)
|
||||
});
|
||||
|
||||
let buffer = cx
|
||||
@@ -1733,7 +1733,7 @@ fn open_telemetry_log_file(
|
||||
|
||||
workspace.update_in( cx, |workspace, window, cx| {
|
||||
let project = workspace.project().clone();
|
||||
let buffer = project.update(cx, |project, cx| project.create_local_buffer(&content, json, cx));
|
||||
let buffer = project.update(cx, |project, cx| project.create_local_buffer(&content, json,false, cx));
|
||||
let buffer = cx.new(|cx| {
|
||||
MultiBuffer::singleton(buffer, cx).with_title("Telemetry Log".into())
|
||||
});
|
||||
@@ -1772,7 +1772,8 @@ fn open_bundled_file(
|
||||
workspace.with_local_workspace(window, cx, |workspace, window, cx| {
|
||||
let project = workspace.project();
|
||||
let buffer = project.update(cx, move |project, cx| {
|
||||
let buffer = project.create_local_buffer(text.as_ref(), language, cx);
|
||||
let buffer =
|
||||
project.create_local_buffer(text.as_ref(), language, false, cx);
|
||||
buffer.update(cx, |buffer, cx| {
|
||||
buffer.set_capability(Capability::ReadOnly, cx);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user