diff --git a/cli/tools/upgrade.rs b/cli/tools/upgrade.rs index 78ac599815..f37ee8455d 100644 --- a/cli/tools/upgrade.rs +++ b/cli/tools/upgrade.rs @@ -270,25 +270,31 @@ pub async fn upgrade( let factory = CliFactory::from_flags(flags).await?; let client = factory.http_client(); let current_exe_path = std::env::current_exe()?; - let metadata = fs::metadata(¤t_exe_path)?; - let permissions = metadata.permissions(); + let output_exe_path = + upgrade_flags.output.as_ref().unwrap_or(¤t_exe_path); - if permissions.readonly() { - bail!( - "You do not have write permission to {}", - current_exe_path.display() - ); - } - #[cfg(unix)] - if std::os::unix::fs::MetadataExt::uid(&metadata) == 0 - && !nix::unistd::Uid::effective().is_root() - { - bail!(concat!( - "You don't have write permission to {} because it's owned by root.\n", - "Consider updating deno through your package manager if its installed from it.\n", - "Otherwise run `deno upgrade` as root.", - ), current_exe_path.display()); - } + let permissions = if let Ok(metadata) = fs::metadata(output_exe_path) { + let permissions = metadata.permissions(); + if permissions.readonly() { + bail!( + "You do not have write permission to {}", + output_exe_path.display() + ); + } + #[cfg(unix)] + if std::os::unix::fs::MetadataExt::uid(&metadata) == 0 + && !nix::unistd::Uid::effective().is_root() + { + bail!(concat!( + "You don't have write permission to {} because it's owned by root.\n", + "Consider updating deno through your package manager if its installed from it.\n", + "Otherwise run `deno upgrade` as root.", + ), output_exe_path.display()); + } + permissions + } else { + fs::metadata(¤t_exe_path)?.permissions() + }; let install_version = match upgrade_flags.version { Some(passed_version) => {