diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2022-06-25 09:21:58 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-25 09:21:58 +0530 |
commit | 18c9a7ad641302a9f5e0ccb07da732890f8e0505 (patch) | |
tree | 9ae7e3b7b34dc4b49fdd8d6281f7a367c043de85 | |
parent | fd5a12d7e25dc53238e2bbcffe970e646c1035f3 (diff) |
fix(core): don't panic on non-existent cwd (#14957)
Co-authored-by: cjihrig <cjihrig@gmail.com>
-rw-r--r-- | cli/main.rs | 2 | ||||
-rw-r--r-- | cli/tests/unit/process_test.ts | 33 | ||||
-rw-r--r-- | core/module_specifier.rs | 4 |
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)) |