Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions e2e/config/test_hooks_postinstall_env
Original file line number Diff line number Diff line change
@@ -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 <<EOF >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
12 changes: 11 additions & 1 deletion src/backend/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Copy link

Copilot AI Sep 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The or_insert method will skip config environment variables if they already exist in exec_env. This may not be the intended behavior if config variables should take precedence over exec_env variables. Consider using env_vars.insert(k, v) instead to ensure config variables override exec_env variables.

Suggested change
env_vars.entry(k).or_insert(v);
env_vars.insert(k, v);

Copilot uses AI. Check for mistakes.
}
}

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(())
}
Expand Down
Loading