Patch-Source: https://github.com/denoland/deno/pull/19910 -- From abb942935bf711e9e05c6eb434ba2415f92daf24 Mon Sep 17 00:00:00 2001 From: Jakub Jirutka Date: Sat, 22 Jul 2023 19:39:01 +0200 Subject: [PATCH] feat(cli): allow to build without upgrade feature The self-upgrade feature is undesirable when deno is installed from (Linux) distribution repository - using a system package manager. This change will allow package maintainers to build deno with the "upgrade" subcommand and background check disabled. When the user runs `deno upgrade ` and the upgrade feature is disabled, it will exit with error message explaining that this deno binary was built without the upgrade feature. Resolves #19909 --- cli/Cargo.toml | 7 +++++++ cli/args/flags.rs | 1 + cli/main.rs | 22 ++++++++++++++++------ cli/tests/integration/flags_tests.rs | 1 + cli/tools/run.rs | 1 + 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 604f9dfbeed4a..e37d82b0ee89d 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -11,6 +11,13 @@ license.workspace = true repository.workspace = true description = "Provides the deno executable" +[features] +default = ["upgrade"] +# A feature that enables the upgrade subcommand and the background check for +# available updates (of deno binary). This is typically disabled for (Linux) +# distribution packages. +upgrade = [] + [[bin]] name = "deno" path = "main.rs" diff --git a/cli/args/flags.rs b/cli/args/flags.rs index 72841df742f31..c5bdd5c691670 100644 --- a/cli/args/flags.rs +++ b/cli/args/flags.rs @@ -1880,6 +1880,7 @@ update to a different location, use the --output flag deno upgrade --output $HOME/my_deno", ) + .hide(cfg!(not(feature = "upgrade"))) .defer(|cmd| { cmd .arg( diff --git a/cli/main.rs b/cli/main.rs index 70db8f147bf4a..fc36e888670f5 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -188,9 +188,15 @@ async fn run_subcommand(flags: Flags) -> Result { let types = tsc::get_types_declaration_file_text(flags.unstable); display::write_to_stdout_ignore_sigpipe(types.as_bytes()) }), + #[cfg(feature = "upgrade")] DenoSubcommand::Upgrade(upgrade_flags) => spawn_subcommand(async { tools::upgrade::upgrade(flags, upgrade_flags).await }), + #[cfg(not(feature = "upgrade"))] + DenoSubcommand::Upgrade(_) => exit_with_message( + "This deno was built without the \"upgrade\" feature", + 1 + ), DenoSubcommand::Vendor(vendor_flags) => spawn_subcommand(async { tools::vendor::vendor(flags, vendor_flags).await }), @@ -223,6 +229,15 @@ fn setup_panic_hook() { })); } +fn exit_with_message(message: &str, code: i32) -> ! { + eprintln!( + "{}: {}", + colors::red_bold("error"), + message.trim_start_matches("error: ") + ); + std::process::exit(code); +} + fn unwrap_or_exit(result: Result) -> T { match result { Ok(value) => value, @@ -237,12 +252,7 @@ fn unwrap_or_exit(result: Result) -> T { error_code = 10; } - eprintln!( - "{}: {}", - colors::red_bold("error"), - error_string.trim_start_matches("error: ") - ); - std::process::exit(error_code); + exit_with_message(&error_string, error_code); } } } diff --git a/cli/tests/integration/flags_tests.rs b/cli/tests/integration/flags_tests.rs index 55a83594b420a..68eed594868a8 100644 --- a/cli/tests/integration/flags_tests.rs +++ b/cli/tests/integration/flags_tests.rs @@ -50,6 +50,7 @@ fn help_output() { "Run a task defined in the configuration file", "Run tests", "Print runtime TypeScript declarations", + #[cfg(feature = "upgrade")] "Upgrade deno executable to given version", "Vendor remote modules into a local directory", "Print this message or the help of the given subcommand(s)", diff --git a/cli/tools/run.rs b/cli/tools/run.rs index 6ded628ea6db4..49e6a33921d7c 100644 --- a/cli/tools/run.rs +++ b/cli/tools/run.rs @@ -44,6 +44,7 @@ To grant permissions, set them before the script argument. For example: // Run a background task that checks for available upgrades. If an earlier // run of this background task found a new version of Deno. + #[cfg(feature = "upgrade")] super::upgrade::check_for_upgrades( http_client.clone(), deno_dir.upgrade_check_file_path(),