diff --git a/e2e/config/test_hooks_postinstall_env b/e2e/config/test_hooks_postinstall_env new file mode 100755 index 0000000000..550b90d59a --- /dev/null +++ b/e2e/config/test_hooks_postinstall_env @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +# Test that postinstall hooks have access to pre_tools environment variables + +# Create a mise.toml with env vars that should be available before tools +cat <mise.toml +[env] +# Environment variable without tools=true (should be available in postinstall) +PRE_TOOLS_VAR = "available_before_tools" + +# Environment variable explicitly with tools=false +EXPLICIT_PRE_TOOLS = {value = "explicitly_pre_tools", tools = false} + +# Environment variable with tools=true (should NOT be available in postinstall) +POST_TOOLS_VAR = {value = "available_after_tools", tools = true} + +[tools] +dummy = { version = "latest", postinstall = "echo PRE_TOOLS_VAR=\$PRE_TOOLS_VAR; echo EXPLICIT_PRE_TOOLS=\$EXPLICIT_PRE_TOOLS; echo POST_TOOLS_VAR=\$POST_TOOLS_VAR" } +EOF + +# Remove any existing dummy installation to force reinstall +rm -rf ~/.mise/installs/dummy + +# Run install and capture output +output=$(mise install dummy 2>&1) + +# Check that pre_tools environment variables are available in postinstall +if [[ $output == *"PRE_TOOLS_VAR=available_before_tools"* ]]; then + echo "✓ PRE_TOOLS_VAR is available in postinstall" +else + echo "✗ PRE_TOOLS_VAR is NOT available in postinstall" + echo "Output: $output" + exit 1 +fi + +if [[ $output == *"EXPLICIT_PRE_TOOLS=explicitly_pre_tools"* ]]; then + echo "✓ EXPLICIT_PRE_TOOLS is available in postinstall" +else + echo "✗ EXPLICIT_PRE_TOOLS is NOT available in postinstall" + echo "Output: $output" + exit 1 +fi + +# The post_tools var should be empty since it's marked as tools=true +if [[ $output == *"POST_TOOLS_VAR="* ]]; then + echo "✓ POST_TOOLS_VAR is empty as expected" +else + echo "✗ POST_TOOLS_VAR is not empty" + echo "Output: $output" + exit 1 +fi + +# Verify that POST_TOOLS_VAR with tools=true is NOT available in postinstall hook +if [[ $output != *"POST_TOOLS_VAR=available_after_tools"* ]]; then + echo "✓ POST_TOOLS_VAR with tools=true is not available as expected" +else + echo "✗ POST_TOOLS_VAR with tools=true should not be available" + echo "Output: $output" + exit 1 +fi diff --git a/src/backend/mod.rs b/src/backend/mod.rs index a7b2de2bfd..3c85fa3494 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -546,13 +546,23 @@ pub trait Backend: Debug + Send + Sync { tv: &ToolVersion, script: &str, ) -> eyre::Result<()> { + // Get pre-tools environment variables from config + let mut env_vars = self.exec_env(&ctx.config, &ctx.ts, tv).await?; + + // Add pre-tools environment variables from config if available + if let Some(config_env) = ctx.config.env_maybe() { + for (k, v) in config_env { + env_vars.entry(k).or_insert(v); + } + } + CmdLineRunner::new(&*env::SHELL) .env(&*env::PATH_KEY, plugins::core::path_env_with_tv_path(tv)?) .env("MISE_TOOL_INSTALL_PATH", tv.install_path()) .with_pr(&ctx.pr) .arg(env::SHELL_COMMAND_FLAG) .arg(script) - .envs(self.exec_env(&ctx.config, &ctx.ts, tv).await?) + .envs(env_vars) .execute()?; Ok(()) }