From d88b71b0e782496dbdb960cc6c64beb330252833 Mon Sep 17 00:00:00 2001 From: Taku Kodma <79110363+risu729@users.noreply.github.com> Date: Fri, 15 May 2026 06:34:40 +1000 Subject: [PATCH 1/3] fix(erlang): respect compile false for precompiled installs --- e2e/core/test_erlang_precompiled_strict | 15 ++++++++ src/plugins/core/erlang.rs | 47 ++++++++++++++++--------- 2 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 e2e/core/test_erlang_precompiled_strict diff --git a/e2e/core/test_erlang_precompiled_strict b/e2e/core/test_erlang_precompiled_strict new file mode 100644 index 0000000000..b449089897 --- /dev/null +++ b/e2e/core/test_erlang_precompiled_strict @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +cat <<'EOF' >mise.toml +[settings.erlang] +compile = false +EOF + +output="$(MISE_FRIENDLY_ERROR=1 RUST_BACKTRACE=0 ImageOS=nobara-43 mise install erlang@28.5 2>&1)" \ + && fail "expected erlang install to fail when precompiled binaries are unavailable" + +[[ $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( From 69d5a48ace71b8851f6fb50b506f77e60a212623 Mon Sep 17 00:00:00 2001 From: Taku Kodma <79110363+risu729@users.noreply.github.com> Date: Fri, 15 May 2026 15:47:43 +1000 Subject: [PATCH 2/3] test(erlang): harden precompiled strict regression --- e2e/core/test_erlang_precompiled_strict | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/e2e/core/test_erlang_precompiled_strict b/e2e/core/test_erlang_precompiled_strict index b449089897..d4acb59263 100644 --- a/e2e/core/test_erlang_precompiled_strict +++ b/e2e/core/test_erlang_precompiled_strict @@ -1,15 +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 -output="$(MISE_FRIENDLY_ERROR=1 RUST_BACKTRACE=0 ImageOS=nobara-43 mise install erlang@28.5 2>&1)" \ - && fail "expected erlang install to fail when precompiled binaries are unavailable" +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 == *"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" +[[ $output != *"build-install"* ]] || + fail "erlang.compile=false should not fall back to kerl build-install: $output" From 2f23361f9b4dfef70d66732305f07fcc4b023f24 Mon Sep 17 00:00:00 2001 From: Taku Kodma <79110363+risu729@users.noreply.github.com> Date: Sat, 16 May 2026 17:50:24 +1000 Subject: [PATCH 3/3] test(erlang): match shell test formatting --- e2e/core/test_erlang_precompiled_strict | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/e2e/core/test_erlang_precompiled_strict b/e2e/core/test_erlang_precompiled_strict index d4acb59263..f2b1ab74c6 100644 --- a/e2e/core/test_erlang_precompiled_strict +++ b/e2e/core/test_erlang_precompiled_strict @@ -1,8 +1,8 @@ #!/usr/bin/env bash if [[ "$(uname -s)" != "Linux" ]]; then - echo "Skipping Linux-specific test on non-Linux OS" - exit 0 + echo "Skipping Linux-specific test on non-Linux OS" + exit 0 fi cat <<'EOF' >mise.toml @@ -11,11 +11,11 @@ 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" + 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" + fail "expected unsupported OS error, got: $output" [[ $output != *"build-install"* ]] || - fail "erlang.compile=false should not fall back to kerl build-install: $output" + fail "erlang.compile=false should not fall back to kerl build-install: $output"