Properly process files that cannot be open for a reason (#37170)

Follow-up of https://github.com/zed-industries/zed/pull/36764

* Fix `anyhow!({e})` conversion lossing Collab error codes context when
opening a buffer remotely

* Use this context to only allow opening files that had not specific
Collab error code

Release Notes:

- N/A
This commit is contained in:
Kirill Bulatov
2025-08-29 14:14:27 +00:00
committed by GitHub
parent 20d32d111c
commit 5001c03711
4 changed files with 45 additions and 33 deletions
+2 -13
View File
@@ -1696,21 +1696,10 @@ impl Client {
);
cx.spawn(async move |_| match future.await {
Ok(()) => {
log::debug!(
"rpc message handled. client_id:{}, sender_id:{:?}, type:{}",
client_id,
original_sender_id,
type_name
);
log::debug!("rpc message handled. client_id:{client_id}, sender_id:{original_sender_id:?}, type:{type_name}");
}
Err(error) => {
log::error!(
"error handling message. client_id:{}, sender_id:{:?}, type:{}, error:{:?}",
client_id,
original_sender_id,
type_name,
error
);
log::error!("error handling message. client_id:{client_id}, sender_id:{original_sender_id:?}, type:{type_name}, error:{error:#}");
}
})
.detach();
+19 -3
View File
@@ -20,7 +20,7 @@ use language::{
},
};
use rpc::{
AnyProtoClient, ErrorExt as _, TypedEnvelope,
AnyProtoClient, ErrorCode, ErrorExt as _, TypedEnvelope,
proto::{self, ToProto},
};
use smol::channel::Receiver;
@@ -837,7 +837,15 @@ impl BufferStore {
}
};
cx.background_spawn(async move { task.await.map_err(|e| anyhow!("{e}")) })
cx.background_spawn(async move {
task.await.map_err(|e| {
if e.error_code() != ErrorCode::Internal {
anyhow!(e.error_code())
} else {
anyhow!("{e}")
}
})
})
}
pub fn create_buffer(&mut self, cx: &mut Context<Self>) -> Task<Result<Entity<Buffer>>> {
@@ -944,7 +952,15 @@ impl BufferStore {
) -> impl Iterator<Item = (&ProjectPath, impl Future<Output = Result<Entity<Buffer>>>)> {
self.loading_buffers.iter().map(|(path, task)| {
let task = task.clone();
(path, async move { task.await.map_err(|e| anyhow!("{e}")) })
(path, async move {
task.await.map_err(|e| {
if e.error_code() != ErrorCode::Internal {
anyhow!(e.error_code())
} else {
anyhow!("{e}")
}
})
})
})
}
+1 -1
View File
@@ -1117,7 +1117,7 @@ impl ChannelClient {
}
Err(error) => {
log::error!(
"{}:error handling message. type:{}, error:{}",
"{}:error handling message. type:{}, error:{:#}",
this.name,
type_name,
format!("{error:#}").lines().fold(
+23 -16
View File
@@ -648,23 +648,30 @@ impl ProjectItemRegistry {
) as Box<_>;
Ok((project_entry_id, build_workspace_item))
}
Err(e) => match entry_abs_path.as_deref().filter(|_| is_file) {
Some(abs_path) => match cx.update(|window, cx| {
T::for_broken_project_item(abs_path, is_local, &e, window, cx)
})? {
Some(broken_project_item_view) => {
let build_workspace_item = Box::new(
move |_: &mut Pane, _: &mut Window, cx: &mut Context<Pane>| {
cx.new(|_| broken_project_item_view).boxed_clone()
},
)
as Box<_>;
Ok((None, build_workspace_item))
Err(e) => {
if e.error_code() == ErrorCode::Internal {
if let Some(abs_path) =
entry_abs_path.as_deref().filter(|_| is_file)
{
if let Some(broken_project_item_view) =
cx.update(|window, cx| {
T::for_broken_project_item(
abs_path, is_local, &e, window, cx,
)
})?
{
let build_workspace_item = Box::new(
move |_: &mut Pane, _: &mut Window, cx: &mut Context<Pane>| {
cx.new(|_| broken_project_item_view).boxed_clone()
},
)
as Box<_>;
return Ok((None, build_workspace_item));
}
}
None => Err(e)?,
},
None => Err(e)?,
},
}
Err(e)
}
}
}))
});