mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-24 19:10:24 +00:00
Do not panic on prettier search
This commit is contained in:
parent
96bbb5cdea
commit
249bec3cac
1 changed files with 55 additions and 65 deletions
|
@ -81,77 +81,67 @@ impl Prettier {
|
|||
if worktree_root != starting_path.worktree_root_path.as_ref() {
|
||||
vec![worktree_root]
|
||||
} else {
|
||||
let (worktree_root_metadata, start_path_metadata) = if starting_path
|
||||
.starting_path
|
||||
.as_ref()
|
||||
== Path::new("")
|
||||
{
|
||||
let worktree_root_data =
|
||||
fs.metadata(&worktree_root).await.with_context(|| {
|
||||
format!(
|
||||
"FS metadata fetch for worktree root path {worktree_root:?}",
|
||||
)
|
||||
})?;
|
||||
(worktree_root_data.unwrap_or_else(|| {
|
||||
panic!("cannot query prettier for non existing worktree root at {worktree_root:?}")
|
||||
}), None)
|
||||
let worktree_root_metadata = fs
|
||||
.metadata(&worktree_root)
|
||||
.await
|
||||
.with_context(|| {
|
||||
format!("FS metadata fetch for worktree root path {worktree_root:?}",)
|
||||
})?
|
||||
.with_context(|| {
|
||||
format!("empty FS metadata for worktree root at {worktree_root:?}")
|
||||
})?;
|
||||
if starting_path.starting_path.as_ref() == Path::new("") {
|
||||
anyhow::ensure!(
|
||||
!worktree_root_metadata.is_dir,
|
||||
"For empty start path, worktree root should not be a directory {starting_path:?}"
|
||||
);
|
||||
anyhow::ensure!(
|
||||
!worktree_root_metadata.is_symlink,
|
||||
"For empty start path, worktree root should not be a symlink {starting_path:?}"
|
||||
);
|
||||
worktree_root
|
||||
.parent()
|
||||
.map(|path| vec![path.to_path_buf()])
|
||||
.unwrap_or_default()
|
||||
} else {
|
||||
let full_starting_path = worktree_root.join(&starting_path.starting_path);
|
||||
let (worktree_root_data, start_path_data) = futures::try_join!(
|
||||
fs.metadata(&worktree_root),
|
||||
fs.metadata(&full_starting_path),
|
||||
)
|
||||
.with_context(|| {
|
||||
format!("FS metadata fetch for starting path {full_starting_path:?}",)
|
||||
})?;
|
||||
(
|
||||
worktree_root_data.unwrap_or_else(|| {
|
||||
panic!("cannot query prettier for non existing worktree root at {worktree_root:?}")
|
||||
}),
|
||||
start_path_data,
|
||||
)
|
||||
};
|
||||
let start_path_metadata = fs
|
||||
.metadata(&full_starting_path)
|
||||
.await
|
||||
.with_context(|| {
|
||||
format!(
|
||||
"FS metadata fetch for starting path {full_starting_path:?}"
|
||||
)
|
||||
})?
|
||||
.with_context(|| {
|
||||
format!(
|
||||
"empty FS metadata for starting path {full_starting_path:?}"
|
||||
)
|
||||
})?;
|
||||
|
||||
match start_path_metadata {
|
||||
Some(start_path_metadata) => {
|
||||
anyhow::ensure!(worktree_root_metadata.is_dir,
|
||||
"For non-empty start path, worktree root {starting_path:?} should be a directory");
|
||||
anyhow::ensure!(
|
||||
!start_path_metadata.is_dir,
|
||||
"For non-empty start path, it should not be a directory {starting_path:?}"
|
||||
);
|
||||
anyhow::ensure!(
|
||||
!start_path_metadata.is_symlink,
|
||||
"For non-empty start path, it should not be a symlink {starting_path:?}"
|
||||
);
|
||||
anyhow::ensure!(worktree_root_metadata.is_dir,
|
||||
"For non-empty start path, worktree root {starting_path:?} should be a directory");
|
||||
anyhow::ensure!(
|
||||
!start_path_metadata.is_dir,
|
||||
"For non-empty start path, it should not be a directory {starting_path:?}"
|
||||
);
|
||||
anyhow::ensure!(
|
||||
!start_path_metadata.is_symlink,
|
||||
"For non-empty start path, it should not be a symlink {starting_path:?}"
|
||||
);
|
||||
|
||||
let file_to_format = starting_path.starting_path.as_ref();
|
||||
let mut paths_to_check = VecDeque::from(vec![worktree_root.clone()]);
|
||||
let mut current_path = worktree_root;
|
||||
for path_component in file_to_format.components().into_iter() {
|
||||
current_path = current_path.join(path_component);
|
||||
paths_to_check.push_front(current_path.clone());
|
||||
if path_component.as_os_str().to_string_lossy() == "node_modules" {
|
||||
break;
|
||||
}
|
||||
let file_to_format = starting_path.starting_path.as_ref();
|
||||
let mut paths_to_check = VecDeque::from(vec![worktree_root.clone()]);
|
||||
let mut current_path = worktree_root;
|
||||
for path_component in file_to_format.components().into_iter() {
|
||||
current_path = current_path.join(path_component);
|
||||
paths_to_check.push_front(current_path.clone());
|
||||
if path_component.as_os_str().to_string_lossy() == "node_modules" {
|
||||
break;
|
||||
}
|
||||
paths_to_check.pop_front(); // last one is the file itself or node_modules, skip it
|
||||
Vec::from(paths_to_check)
|
||||
}
|
||||
None => {
|
||||
anyhow::ensure!(
|
||||
!worktree_root_metadata.is_dir,
|
||||
"For empty start path, worktree root should not be a directory {starting_path:?}"
|
||||
);
|
||||
anyhow::ensure!(
|
||||
!worktree_root_metadata.is_symlink,
|
||||
"For empty start path, worktree root should not be a symlink {starting_path:?}"
|
||||
);
|
||||
worktree_root
|
||||
.parent()
|
||||
.map(|path| vec![path.to_path_buf()])
|
||||
.unwrap_or_default()
|
||||
}
|
||||
paths_to_check.pop_front(); // last one is the file itself or node_modules, skip it
|
||||
Vec::from(paths_to_check)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue