diff options
-rw-r--r-- | cli/npm/managed/resolvers/common.rs | 47 | ||||
-rw-r--r-- | cli/tools/task.rs | 3 | ||||
-rw-r--r-- | tests/specs/task/node_modules_dir_false/__test__.jsonc | 16 | ||||
-rw-r--r-- | tests/specs/task/node_modules_dir_false/deno.json | 6 |
4 files changed, 49 insertions, 23 deletions
diff --git a/cli/npm/managed/resolvers/common.rs b/cli/npm/managed/resolvers/common.rs index 227805d4e..a326b562b 100644 --- a/cli/npm/managed/resolvers/common.rs +++ b/cli/npm/managed/resolvers/common.rs @@ -9,6 +9,7 @@ use std::sync::Mutex; use async_trait::async_trait; use deno_ast::ModuleSpecifier; +use deno_core::anyhow::Context; use deno_core::error::AnyError; use deno_core::futures; use deno_core::unsync::spawn; @@ -91,29 +92,31 @@ impl RegistryReadPermissionChecker { if is_path_in_node_modules { let mut cache = self.cache.lock().unwrap(); - let registry_path_canon = match cache.get(&self.registry_path) { - Some(canon) => canon.clone(), - None => { - let canon = self.fs.realpath_sync(&self.registry_path)?; - cache.insert(self.registry_path.to_path_buf(), canon.clone()); - canon - } - }; - - let path_canon = match cache.get(path) { - Some(canon) => canon.clone(), - None => { - let canon = self.fs.realpath_sync(path); - if let Err(e) = &canon { - if e.kind() == ErrorKind::NotFound { - return Ok(()); - } + let mut canonicalize = + |path: &Path| -> Result<Option<PathBuf>, AnyError> { + match cache.get(path) { + Some(canon) => Ok(Some(canon.clone())), + None => match self.fs.realpath_sync(path) { + Ok(canon) => { + cache.insert(path.to_path_buf(), canon.clone()); + Ok(Some(canon)) + } + Err(e) => { + if e.kind() == ErrorKind::NotFound { + return Ok(None); + } + Err(AnyError::from(e)).with_context(|| { + format!("failed canonicalizing '{}'", path.display()) + }) + } + }, } - - let canon = canon?; - cache.insert(path.to_path_buf(), canon.clone()); - canon - } + }; + let Some(registry_path_canon) = canonicalize(&self.registry_path)? else { + return Ok(()); // not exists, allow reading + }; + let Some(path_canon) = canonicalize(path)? else { + return Ok(()); // not exists, allow reading }; if path_canon.starts_with(registry_path_canon) { diff --git a/cli/tools/task.rs b/cli/tools/task.rs index 60867b768..3a30dd008 100644 --- a/cli/tools/task.rs +++ b/cli/tools/task.rs @@ -70,7 +70,8 @@ pub async fn execute_script( bail!("Only local configuration files are supported") }; let cwd = match task_flags.cwd { - Some(path) => canonicalize_path(&PathBuf::from(path))?, + Some(path) => canonicalize_path(&PathBuf::from(path)) + .context("failed canonicalizing --cwd")?, None => config_file_path.parent().unwrap().to_owned(), }; diff --git a/tests/specs/task/node_modules_dir_false/__test__.jsonc b/tests/specs/task/node_modules_dir_false/__test__.jsonc new file mode 100644 index 000000000..5f5286487 --- /dev/null +++ b/tests/specs/task/node_modules_dir_false/__test__.jsonc @@ -0,0 +1,16 @@ +{ + "tempDir": true, + "steps": [{ + "args": "cache npm:@denotest/esm-basic", + "output": "[WILDCARD]" + }, { + "args": [ + "eval", + "Deno.removeSync('./node_modules', { recursive: true });" + ], + "output": "[WILDCARD]" + }, { + "args": "task --quiet repro", + "output": "hi\n" + }] +} diff --git a/tests/specs/task/node_modules_dir_false/deno.json b/tests/specs/task/node_modules_dir_false/deno.json new file mode 100644 index 000000000..cacff662c --- /dev/null +++ b/tests/specs/task/node_modules_dir_false/deno.json @@ -0,0 +1,6 @@ +{ + "nodeModulesDir": true, + "tasks": { + "repro": "echo hi" + } +} |