From 97937a097e8fe52cdefd55bf12a92e19d627aca4 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Wed, 3 Jan 2024 09:45:10 -0500 Subject: [PATCH] fix(jupyter): error message when install fails due to jupyter command not being on PATH (#21767) We were failing silently in this scenario. --- cli/tests/integration/jupyter_tests.rs | 8 +++++ cli/tests/integration/mod.rs | 5 ++- .../jupyter/install_command_not_exists.out | 4 +++ cli/tools/jupyter/install.rs | 36 +++++++++++++------ 4 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 cli/tests/integration/jupyter_tests.rs create mode 100644 cli/tests/testdata/jupyter/install_command_not_exists.out diff --git a/cli/tests/integration/jupyter_tests.rs b/cli/tests/integration/jupyter_tests.rs new file mode 100644 index 0000000000..847290ef82 --- /dev/null +++ b/cli/tests/integration/jupyter_tests.rs @@ -0,0 +1,8 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. + +itest!(jupyter_install_command_not_exists { + args: "jupyter --unstable --install", + output: "jupyter/install_command_not_exists.out", + envs: vec![("PATH".to_string(), "".to_string())], + exit_code: 1, +}); diff --git a/cli/tests/integration/mod.rs b/cli/tests/integration/mod.rs index f599e2e879..19796f245f 100644 --- a/cli/tests/integration/mod.rs +++ b/cli/tests/integration/mod.rs @@ -121,7 +121,10 @@ mod inspector; mod install; #[path = "js_unit_tests.rs"] mod js_unit_tests; -mod jsr_tests; +#[path = "jsr_tests.rs"] +mod jsr; +#[path = "jupyter_tests.rs"] +mod jupyter; #[path = "lint_tests.rs"] mod lint; #[path = "lsp_tests.rs"] diff --git a/cli/tests/testdata/jupyter/install_command_not_exists.out b/cli/tests/testdata/jupyter/install_command_not_exists.out new file mode 100644 index 0000000000..3d599f7fc1 --- /dev/null +++ b/cli/tests/testdata/jupyter/install_command_not_exists.out @@ -0,0 +1,4 @@ +error: Failed to spawn 'jupyter' command. Is JupyterLab installed (https://jupyter.org/install) and available on the PATH? + +Caused by: +[WILDCARD] diff --git a/cli/tools/jupyter/install.rs b/cli/tools/jupyter/install.rs index ef442e1255..3b2079db06 100644 --- a/cli/tools/jupyter/install.rs +++ b/cli/tools/jupyter/install.rs @@ -6,6 +6,7 @@ use deno_core::error::AnyError; use deno_core::serde_json; use deno_core::serde_json::json; use std::env::current_exe; +use std::io::ErrorKind; use std::io::Write; use std::path::Path; use tempfile::TempDir; @@ -76,19 +77,34 @@ pub fn install() -> Result<(), AnyError> { &temp_dir.path().to_string_lossy(), ]) .spawn(); + let mut child = match child_result { + Ok(child) => child, + Err(err) + if matches!( + err.kind(), + ErrorKind::NotFound | ErrorKind::PermissionDenied + ) => + { + return Err(err).context(concat!( + "Failed to spawn 'jupyter' command. Is JupyterLab installed ", + "(https://jupyter.org/install) and available on the PATH?" + )); + } + Err(err) => { + return Err(err).context("Failed to spawn 'jupyter' command."); + } + }; - if let Ok(mut child) = child_result { - let wait_result = child.wait(); - match wait_result { - Ok(status) => { - if !status.success() { - bail!("Failed to install kernelspec, try again."); - } - } - Err(err) => { - bail!("Failed to install kernelspec: {}", err); + let wait_result = child.wait(); + match wait_result { + Ok(status) => { + if !status.success() { + bail!("Failed to install kernelspec, try again."); } } + Err(err) => { + bail!("Failed to install kernelspec: {}", err); + } } let _ = std::fs::remove_dir(temp_dir);