From 6269608cd617a17c83d09756e02144a223c0c1b0 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Sat, 26 Apr 2025 08:40:30 -0500 Subject: [PATCH] fix(hook-env): path order Fixes #4828 --- e2e/tools/test_path_order | 1 + src/toolset/tool_request_set.rs | 50 ++++++++++++++++----------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/e2e/tools/test_path_order b/e2e/tools/test_path_order index 9f57e376624..c3ebabe9098 100644 --- a/e2e/tools/test_path_order +++ b/e2e/tools/test_path_order @@ -25,3 +25,4 @@ $MISE_DATA_DIR/installs/pitchfork/0.1.5 $MISE_DATA_DIR/installs/jq/1.7.1" assert "mise env | grep PATH" "export PATH='$HOME/workdir/subdir/bin:$HOME/workdir/subdir/bin2:$HOME/workdir/bin:$HOME/workdir/bin2:$MISE_DATA_DIR/installs/dummy/2.0.0/bin:$MISE_DATA_DIR/installs/pitchfork/0.1.5:$MISE_DATA_DIR/installs/jq/1.7.1:$PATH'" +assert "mise hook-env | grep PATH | tail -n1" "export PATH='$HOME/workdir/subdir/bin:$HOME/workdir/subdir/bin2:$HOME/workdir/bin:$HOME/workdir/bin2:$MISE_DATA_DIR/installs/dummy/2.0.0/bin:$MISE_DATA_DIR/installs/pitchfork/0.1.5:$MISE_DATA_DIR/installs/jq/1.7.1:$PATH'" diff --git a/src/toolset/tool_request_set.rs b/src/toolset/tool_request_set.rs index 75629165381..07473486aaf 100644 --- a/src/toolset/tool_request_set.rs +++ b/src/toolset/tool_request_set.rs @@ -151,15 +151,14 @@ impl ToolRequestSetBuilder { pub fn build(&self) -> eyre::Result { let mut trs = ToolRequestSet::default(); - self.load_config_files(&mut trs)?; - self.load_runtime_env(&mut trs)?; - self.load_runtime_args(&mut trs)?; - - let backends = trs.tools.keys().cloned().collect::>(); - for fa in &backends { - if self.is_disabled(fa) { - trs.tools.shift_remove(fa); - trs.sources.remove(fa); + trs = self.load_config_files(trs)?; + trs = self.load_runtime_env(trs)?; + trs = self.load_runtime_args(trs)?; + + for ba in trs.tools.keys().cloned().collect_vec() { + if self.is_disabled(&ba) { + trs.tools.shift_remove(&ba); + trs.sources.remove(&ba); } } @@ -175,15 +174,15 @@ impl ToolRequestSetBuilder { || self.disable_tools.contains(ba) } - fn load_config_files(&self, trs: &mut ToolRequestSet) -> eyre::Result<()> { + fn load_config_files(&self, mut trs: ToolRequestSet) -> eyre::Result { let config = Config::get(); for cf in config.config_files.values().rev() { - merge(trs, cf.to_tool_request_set()?); + trs = merge(trs, cf.to_tool_request_set()?); } - Ok(()) + Ok(trs) } - fn load_runtime_env(&self, trs: &mut ToolRequestSet) -> eyre::Result<()> { + fn load_runtime_env(&self, mut trs: ToolRequestSet) -> eyre::Result { for (k, v) in env::vars() { if k.starts_with("MISE_") && k.ends_with("_VERSION") && k != "MISE_VERSION" { let plugin_name = k @@ -201,13 +200,13 @@ impl ToolRequestSetBuilder { let tvr = ToolRequest::new(fa.clone(), v, source.clone())?; env_ts.add_version(tvr, &source); } - merge(trs, env_ts); + trs = merge(trs, env_ts); } } - Ok(()) + Ok(trs) } - fn load_runtime_args(&self, trs: &mut ToolRequestSet) -> eyre::Result<()> { + fn load_runtime_args(&self, mut trs: ToolRequestSet) -> eyre::Result { for (_, args) in self.args.iter().into_group_map_by(|arg| arg.ba.clone()) { let mut arg_ts = ToolRequestSet::new(); for arg in args { @@ -225,7 +224,7 @@ impl ToolRequestSetBuilder { } } } - merge(trs, arg_ts); + trs = merge(trs, arg_ts); } let tool_args = env::TOOL_ARGS.read().unwrap(); @@ -239,16 +238,17 @@ impl ToolRequestSetBuilder { arg_trs.add_version(tr, &ToolSource::Argument); } } - merge(trs, arg_trs); + trs = merge(trs, arg_trs); - Ok(()) + Ok(trs) } } -fn merge(a: &mut ToolRequestSet, b: ToolRequestSet) { - for (fa, versions) in b.tools { - let source = b.sources[&fa].clone(); - a.tools.insert(fa.clone(), versions); - a.sources.insert(fa, source); - } +fn merge(mut a: ToolRequestSet, mut b: ToolRequestSet) -> ToolRequestSet { + // move things around such that the tools are in the config order + a.tools.retain(|ba, _| !b.tools.contains_key(ba)); + a.sources.retain(|ba, _| !b.sources.contains_key(ba)); + b.tools.extend(a.tools); + b.sources.extend(a.sources); + b }