From a921d537383fc8a2f5547ee42838f6872960163a Mon Sep 17 00:00:00 2001 From: modernzju Date: Sun, 21 Jun 2026 00:45:12 +0800 Subject: [PATCH] Fix nested file search when starter path is a file Signed-off-by: modernzju --- sway-utils/src/helpers.rs | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/sway-utils/src/helpers.rs b/sway-utils/src/helpers.rs index 45ca8603f0e..164f221ff74 100644 --- a/sway-utils/src/helpers.rs +++ b/sway-utils/src/helpers.rs @@ -58,7 +58,7 @@ pub fn find_nested_dir_with_file(starter_path: &Path, file_name: &str) -> Option } else { starter_path.parent()? }; - WalkDir::new(starter_path).into_iter().find_map(|e| { + WalkDir::new(starter_dir).into_iter().find_map(|e| { let entry = e.ok()?; if entry.path() != starter_dir.join(file_name) && entry.file_name() == OsStr::new(file_name) { @@ -117,3 +117,38 @@ where } }) } + +#[cfg(test)] +mod tests { + use super::*; + use std::{ + fs::{self, File}, + process, + time::{SystemTime, UNIX_EPOCH}, + }; + + fn test_dir(name: &str) -> PathBuf { + let nanos = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("system time should be after UNIX_EPOCH") + .as_nanos(); + std::env::temp_dir().join(format!("sway-utils-{name}-{}-{nanos}", process::id())) + } + + #[test] + fn finds_nested_dir_when_starter_path_is_a_file() { + let root = test_dir("finds-nested-dir-from-file"); + let nested_dir = root.join("nested"); + fs::create_dir_all(&nested_dir).expect("failed to create nested dir"); + + let file_name = "Forc.toml"; + let starter_file = root.join(file_name); + File::create(&starter_file).expect("failed to create root manifest"); + File::create(nested_dir.join(file_name)).expect("failed to create nested manifest"); + + let nested = find_nested_dir_with_file(&starter_file, file_name); + + fs::remove_dir_all(&root).expect("failed to remove test dir"); + assert_eq!(nested, Some(nested_dir)); + } +}