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:
@@ -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();
|
||||
|
||||
@@ -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}")
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}))
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user