Do not panic on prettier search

Kirill Bulatov created

Change summary

crates/prettier/src/prettier.rs | 120 ++++++++++++++++------------------
1 file changed, 55 insertions(+), 65 deletions(-)

Detailed changes

crates/prettier/src/prettier.rs 🔗

@@ -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(|| {
+                    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 start_path_metadata = fs
+                            .metadata(&full_starting_path)
+                            .await
+                            .with_context(|| {
+                                format!(
+                                    "FS metadata fetch for starting path {full_starting_path:?}"
+                                )
+                            })?
+                            .with_context(|| {
                                 format!(
-                                    "FS metadata fetch for worktree root path {worktree_root:?}",
+                                    "empty FS metadata for starting path {full_starting_path:?}"
                                 )
                             })?;
-                        (worktree_root_data.unwrap_or_else(|| {
-                            panic!("cannot query prettier for non existing worktree root at {worktree_root:?}")
-                        }), None)
-                    } 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,
-                        )
-                    };
-
-                    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:?}"
-                            );
 
-                            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;
-                                }
+                        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;
                             }
-                            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)
                     }
                 }
             }