summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2022-06-25 09:21:58 +0530
committerGitHub <noreply@github.com>2022-06-25 09:21:58 +0530
commit18c9a7ad641302a9f5e0ccb07da732890f8e0505 (patch)
tree9ae7e3b7b34dc4b49fdd8d6281f7a367c043de85
parentfd5a12d7e25dc53238e2bbcffe970e646c1035f3 (diff)
fix(core): don't panic on non-existent cwd (#14957)
Co-authored-by: cjihrig <cjihrig@gmail.com>
-rw-r--r--cli/main.rs2
-rw-r--r--cli/tests/unit/process_test.ts33
-rw-r--r--core/module_specifier.rs4
3 files changed, 37 insertions, 2 deletions
diff --git a/cli/main.rs b/cli/main.rs
index 01dbba848..d9c4486f4 100644
--- a/cli/main.rs
+++ b/cli/main.rs
@@ -602,7 +602,7 @@ async fn eval_command(
// deno_graph works off of extensions for local files to determine the media
// type, and so our "fake" specifier needs to have the proper extension.
let main_module =
- resolve_url_or_path(&format!("./$deno$eval.{}", eval_flags.ext)).unwrap();
+ resolve_url_or_path(&format!("./$deno$eval.{}", eval_flags.ext))?;
let permissions = Permissions::from_options(&flags.permissions_options());
let ps = ProcState::build(Arc::new(flags)).await?;
let mut worker = create_main_worker(
diff --git a/cli/tests/unit/process_test.ts b/cli/tests/unit/process_test.ts
index 5acb92226..e610095ff 100644
--- a/cli/tests/unit/process_test.ts
+++ b/cli/tests/unit/process_test.ts
@@ -2,6 +2,7 @@
import {
assert,
assertEquals,
+ assertStrictEquals,
assertStringIncludes,
assertThrows,
} from "./test_util.ts";
@@ -628,3 +629,35 @@ Deno.test(
}
},
);
+
+Deno.test(
+ {
+ permissions: { run: true, read: true, write: true },
+ ignore: Deno.build.os === "windows",
+ },
+ async function non_existent_cwd(): Promise<void> {
+ const p = Deno.run({
+ cmd: [
+ Deno.execPath(),
+ "eval",
+ `const dir = Deno.makeTempDirSync();
+ Deno.chdir(dir);
+ Deno.removeSync(dir);
+ const p = Deno.run({cmd:[Deno.execPath(), "eval", "console.log(1);"]});
+ const { code } = await p.status();
+ p.close();
+ Deno.exit(code);
+ `,
+ ],
+ stdout: "piped",
+ stderr: "piped",
+ });
+
+ const { code } = await p.status();
+ const stderr = new TextDecoder().decode(await p.stderrOutput());
+ p.close();
+ p.stdout.close();
+ assertStrictEquals(code, 1);
+ assertStringIncludes(stderr, "invalid module path");
+ },
+);
diff --git a/core/module_specifier.rs b/core/module_specifier.rs
index ecdebbd74..3f329f53f 100644
--- a/core/module_specifier.rs
+++ b/core/module_specifier.rs
@@ -138,7 +138,9 @@ pub fn resolve_url_or_path(
pub fn resolve_path(
path_str: &str,
) -> Result<ModuleSpecifier, ModuleResolutionError> {
- let path = current_dir().unwrap().join(path_str);
+ let path = current_dir()
+ .map_err(|_| ModuleResolutionError::InvalidPath(path_str.into()))?
+ .join(path_str);
let path = normalize_path(&path);
Url::from_file_path(path.clone())
.map_err(|()| ModuleResolutionError::InvalidPath(path))