summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/args/flags.rs1
-rw-r--r--cli/tools/installer.rs20
-rw-r--r--tests/specs/install/install_single_http_url_without_global_flag/__test__.jsonc14
-rw-r--r--tests/specs/install/install_single_http_url_without_global_flag/install_http.out2
-rw-r--r--tests/specs/install/install_single_http_url_without_global_flag/install_https.out2
5 files changed, 38 insertions, 1 deletions
diff --git a/cli/args/flags.rs b/cli/args/flags.rs
index 44f97010f..2467de88f 100644
--- a/cli/args/flags.rs
+++ b/cli/args/flags.rs
@@ -237,7 +237,6 @@ pub struct InstallFlagsGlobal {
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum InstallKind {
- #[allow(unused)]
Local(Option<AddFlags>),
Global(InstallFlagsGlobal),
}
diff --git a/cli/tools/installer.rs b/cli/tools/installer.rs
index c3f415dc7..6965d5c6d 100644
--- a/cli/tools/installer.rs
+++ b/cli/tools/installer.rs
@@ -15,6 +15,7 @@ use crate::factory::CliFactory;
use crate::http_util::HttpClientProvider;
use crate::util::fs::canonicalize_path_maybe_not_exists;
+use deno_core::anyhow::bail;
use deno_core::anyhow::Context;
use deno_core::error::generic_error;
use deno_core::error::AnyError;
@@ -284,6 +285,24 @@ async fn install_local(
Ok(())
}
+fn check_if_installs_a_single_package_globally(
+ maybe_add_flags: Option<&AddFlags>,
+) -> Result<(), AnyError> {
+ let Some(add_flags) = maybe_add_flags else {
+ return Ok(());
+ };
+ if add_flags.packages.len() != 1 {
+ return Ok(());
+ }
+ let Ok(url) = Url::parse(&add_flags.packages[0]) else {
+ return Ok(());
+ };
+ if matches!(url.scheme(), "http" | "https") {
+ bail!("Failed to install \"{}\" specifier. If you are trying to install {} globally, run again with `-g` flag:\n deno install -g {}", url.scheme(), url.as_str(), url.as_str());
+ }
+ Ok(())
+}
+
pub async fn install_command(
flags: Arc<Flags>,
install_flags: InstallFlags,
@@ -297,6 +316,7 @@ pub async fn install_command(
install_global(flags, global_flags).await
}
InstallKind::Local(maybe_add_flags) => {
+ check_if_installs_a_single_package_globally(maybe_add_flags.as_ref())?;
install_local(flags, maybe_add_flags).await
}
}
diff --git a/tests/specs/install/install_single_http_url_without_global_flag/__test__.jsonc b/tests/specs/install/install_single_http_url_without_global_flag/__test__.jsonc
new file mode 100644
index 000000000..b906a846d
--- /dev/null
+++ b/tests/specs/install/install_single_http_url_without_global_flag/__test__.jsonc
@@ -0,0 +1,14 @@
+{
+ "steps": [
+ {
+ "args": "install http://example.com",
+ "output": "install_http.out",
+ "exitCode": 1
+ },
+ {
+ "args": "install https://example.com",
+ "output": "install_https.out",
+ "exitCode": 1
+ }
+ ]
+}
diff --git a/tests/specs/install/install_single_http_url_without_global_flag/install_http.out b/tests/specs/install/install_single_http_url_without_global_flag/install_http.out
new file mode 100644
index 000000000..17f4b286d
--- /dev/null
+++ b/tests/specs/install/install_single_http_url_without_global_flag/install_http.out
@@ -0,0 +1,2 @@
+error: Failed to install "http" specifier. If you are trying to install http://example.com/ globally, run again with `-g` flag:
+ deno install -g http://example.com/
diff --git a/tests/specs/install/install_single_http_url_without_global_flag/install_https.out b/tests/specs/install/install_single_http_url_without_global_flag/install_https.out
new file mode 100644
index 000000000..87597de12
--- /dev/null
+++ b/tests/specs/install/install_single_http_url_without_global_flag/install_https.out
@@ -0,0 +1,2 @@
+error: Failed to install "https" specifier. If you are trying to install https://example.com/ globally, run again with `-g` flag:
+ deno install -g https://example.com/