Patch-Source: https://github.com/denoland/deno/pull/19910
--
From abb942935bf711e9e05c6eb434ba2415f92daf24 Mon Sep 17 00:00:00 2001
From: Jakub Jirutka <jakub@jirutka.cz>
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 <args>` 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<i32, AnyError> {
       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<T>(result: Result<T, AnyError>) -> T {
   match result {
     Ok(value) => value,
@@ -237,12 +252,7 @@ fn unwrap_or_exit<T>(result: Result<T, AnyError>) -> 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(),
