From acbf82b9e96290162b4498817c711d584308f40a Mon Sep 17 00:00:00 2001 From: killa Date: Tue, 28 Apr 2026 03:46:14 +0800 Subject: [PATCH] perf(pm): fast path npm package clone source --- crates/pm/src/util/cloner.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/crates/pm/src/util/cloner.rs b/crates/pm/src/util/cloner.rs index f7ff1c6a7..0d4938d70 100644 --- a/crates/pm/src/util/cloner.rs +++ b/crates/pm/src/util/cloner.rs @@ -350,7 +350,15 @@ async fn validate_directory(src: &Path, dst: &Path) -> Result { // find the first non built subdirectory pub async fn find_real_src>(src: P) -> Option { - let mut read_dir = fs::read_dir(src.as_ref()).await.ok()?; + let src = src.as_ref(); + let package_dir = src.join("package"); + if let Ok(metadata) = fs::metadata(&package_dir).await + && metadata.is_dir() + { + return Some(package_dir); + } + + let mut read_dir = fs::read_dir(src).await.ok()?; while let Some(entry) = read_dir.next_entry().await.ok()? { if let Ok(metadata) = entry.metadata().await && metadata.is_dir() @@ -648,6 +656,21 @@ mod tests { Ok(()) } + #[tokio::test] + async fn test_find_real_src_prefers_package_dir() -> Result<()> { + let temp = TempDir::new()?; + let dir = temp.path().join("test_dir"); + fs::create_dir(&dir).await?; + + let package_dir = dir.join("package"); + let other_dir = dir.join("zzz"); + fs::create_dir(&other_dir).await?; + fs::create_dir(&package_dir).await?; + + assert_eq!(find_real_src(&dir).await.unwrap(), package_dir); + Ok(()) + } + #[tokio::test] async fn test_clone_without_find_real() -> Result<()> { let temp = TempDir::new()?;