diff --git a/e2e/core/test_erlang_precompiled_strict b/e2e/core/test_erlang_precompiled_strict new file mode 100644 index 0000000000..f2b1ab74c6 --- /dev/null +++ b/e2e/core/test_erlang_precompiled_strict @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +if [[ "$(uname -s)" != "Linux" ]]; then + echo "Skipping Linux-specific test on non-Linux OS" + exit 0 +fi + +cat <<'EOF' >mise.toml +[settings.erlang] +compile = false +EOF + +if output="$(MISE_FRIENDLY_ERROR=1 RUST_BACKTRACE=0 ImageOS=nobara-43 mise install erlang@28.5 2>&1)"; then + fail "expected erlang install to fail when precompiled binaries are unavailable" +fi + +[[ $output == *"precompiled erlang is not available: unsupported OS version: nobara-43"* ]] || + fail "expected unsupported OS error, got: $output" + +[[ $output != *"build-install"* ]] || + fail "erlang.compile=false should not fall back to kerl build-install: $output" diff --git a/src/plugins/core/erlang.rs b/src/plugins/core/erlang.rs index 649925bae0..fd72f0e9d4 100644 --- a/src/plugins/core/erlang.rs +++ b/src/plugins/core/erlang.rs @@ -15,7 +15,7 @@ use crate::lock_file::LockFile; use crate::toolset::{ToolRequest, ToolVersion}; use crate::{file, github, plugins}; use async_trait::async_trait; -use eyre::Result; +use eyre::{Result, bail}; use xx::regex; #[cfg(linux)] @@ -84,6 +84,15 @@ impl ErlangPlugin { Ok(()) } + fn precompiled_unavailable(&self, reason: impl Into) -> Result> { + let reason = reason.into(); + if Settings::get().erlang.compile == Some(false) { + bail!("precompiled erlang is not available: {reason}"); + } + debug!("{reason}"); + Ok(None) + } + #[cfg(linux)] async fn install_precompiled( &self, @@ -100,8 +109,7 @@ impl ErlangPlugin { "x64" => "amd64".to_string(), "arm64" => "arm64".to_string(), other => { - debug!("Unsupported architecture: {}", other); - return Ok(None); + return self.precompiled_unavailable(format!("unsupported architecture: {other}")); } }; @@ -116,13 +124,12 @@ impl ErlangPlugin { } else if let Ok(os_release) = &*os_release::OS_RELEASE { os_ver = format!("{}-{}", os_release.id, os_release.version_id); } else { - return Ok(None); + return self.precompiled_unavailable("could not determine OS release"); }; // Currently, Bob only builds for Ubuntu, so we have to check that we're on ubuntu, and on a supported version if !["ubuntu-20.04", "ubuntu-22.04", "ubuntu-24.04"].contains(&os_ver.as_str()) { - debug!("Unsupported OS version: {}", os_ver); - return Ok(None); + return self.precompiled_unavailable(format!("unsupported OS version: {os_ver}")); } let url: String = @@ -190,8 +197,8 @@ impl ErlangPlugin { let gh_release = match github::get_release("erlef/otp_builds", &release_tag).await { Ok(release) => release, Err(e) => { - debug!("Failed to get release: {}", e); - return Ok(None); + return self + .precompiled_unavailable(format!("failed to get release {release_tag}: {e}")); } }; let settings = Settings::get(); @@ -208,8 +215,9 @@ impl ErlangPlugin { let asset = match gh_release.assets.iter().find(|a| a.name == tarball_name) { Some(asset) => asset, None => { - debug!("No asset found for {}", release_tag); - return Ok(None); + return self.precompiled_unavailable(format!( + "no asset found for {tarball_name} in {release_tag}" + )); } }; ctx.pr.set_message(format!("Downloading {tarball_name}")); @@ -246,8 +254,8 @@ impl ErlangPlugin { let gh_release = match github::get_release("erlang/otp", &release_tag).await { Ok(release) => release, Err(e) => { - debug!("Failed to get release: {}", e); - return Ok(None); + return self + .precompiled_unavailable(format!("failed to get release {release_tag}: {e}")); } }; let settings = Settings::get(); @@ -259,8 +267,9 @@ impl ErlangPlugin { let asset = match gh_release.assets.iter().find(|a| a.name == zip_name) { Some(asset) => asset, None => { - debug!("No asset found for {}", release_tag); - return Ok(None); + return self.precompiled_unavailable(format!( + "no asset found for {zip_name} in {release_tag}" + )); } }; ctx.pr.set_message(format!("Downloading {}", zip_name)); @@ -280,10 +289,14 @@ impl ErlangPlugin { #[cfg(not(any(linux, macos, windows)))] async fn install_precompiled( &self, - ctx: &InstallContext, - tv: ToolVersion, + _ctx: &InstallContext, + _tv: ToolVersion, ) -> Result> { - Ok(None) + if Settings::get().erlang.compile == Some(true) { + Ok(None) + } else { + self.precompiled_unavailable("precompiled erlang is not supported on this platform") + } } async fn install_via_kerl(