From f057457b81e0f2721955f2f4f680de7ad014bb57 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Sun, 16 Feb 2025 14:03:44 -0600 Subject: [PATCH] fix: regression with env overriding (#4421) --- e2e/env/test_env_profiles | 9 +++++++++ e2e/tools/test_path_order | 6 +++--- src/config/env_directive/mod.rs | 15 +++++++++++---- src/config/env_directive/path.rs | 6 +++--- src/config/mod.rs | 1 + 5 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 e2e/env/test_env_profiles diff --git a/e2e/env/test_env_profiles b/e2e/env/test_env_profiles new file mode 100644 index 000000000..2bdcc94a6 --- /dev/null +++ b/e2e/env/test_env_profiles @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +echo 'env.AAA = "main"' >.mise.toml +echo 'env.AAA = "override-1"' >mise.override1.toml +echo 'env.AAA = "override-2"' >mise.override2.toml + +assert "mise env --json | jq -r .AAA" "main" +MISE_ENV=override1 assert "mise env --json | jq -r .AAA" "override-1" +MISE_ENV=override1,override2 assert "mise env --json | jq -r .AAA" "override-2" diff --git a/e2e/tools/test_path_order b/e2e/tools/test_path_order index 69b9d5dbf..9f57e3766 100644 --- a/e2e/tools/test_path_order +++ b/e2e/tools/test_path_order @@ -2,7 +2,7 @@ cat <mise.toml [env] -_.path = ["bin"] +_.path = ["bin", "bin2"] [tools] dummy = "1.0.0" jq = "1.7.1" @@ -11,7 +11,7 @@ EOF mkdir bin subdir subdir/bin cat <subdir/mise.toml [env] -_.path = ["bin"] +_.path = ["bin", "bin2"] [tools] dummy = "2.0.0" pitchfork = "0.1.5" @@ -24,4 +24,4 @@ assert "mise bin-paths" "$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" -assert "mise env | grep PATH" "export PATH='$HOME/workdir/subdir/bin:$HOME/workdir/bin:$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 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'" diff --git a/src/config/env_directive/mod.rs b/src/config/env_directive/mod.rs index b8b2b7994..ae767dabb 100644 --- a/src/config/env_directive/mod.rs +++ b/src/config/env_directive/mod.rs @@ -7,6 +7,7 @@ use crate::path_env::PathEnv; use crate::tera::{get_tera, tera_exec}; use eyre::{eyre, Context}; use indexmap::IndexMap; +use itertools::Itertools; use serde_json::Value; use std::cmp::PartialEq; use std::collections::{BTreeSet, HashMap}; @@ -335,18 +336,24 @@ impl EnvResults { } // trace!("resolve: paths: {:#?}", &paths); // trace!("resolve: ctx.env: {:#?}", &ctx.get("env")); - for (p, source) in paths { - // trace!("resolve: entry: {:?}, source: {}", &entry, display_path(source)); + for (source, paths) in &paths.iter().chunk_by(|(_, source)| source) { let config_root = source .parent() .map(Path::to_path_buf) .or_else(|| dirs::CWD.clone()) .unwrap_or_default(); - env::split_paths(&p) + let paths = paths.map(|(p, _)| p).collect_vec(); + let paths = paths + .iter() + .rev() + .flat_map(|path| env::split_paths(path)) .map(|s| normalize_path(&config_root, s)) - .for_each(|p| r.env_paths.push(p.clone())); + .collect::>(); + r.env_paths.extend(paths); } + r.env_paths.reverse(); + Ok(r) } diff --git a/src/config/env_directive/path.rs b/src/config/env_directive/path.rs index fc734afe7..f47312737 100644 --- a/src/config/env_directive/path.rs +++ b/src/config/env_directive/path.rs @@ -62,11 +62,11 @@ mod tests { results.env_paths.into_iter().map(|p| replace_path(&p.display().to_string())).collect::>(), @r#" [ + "~/foo/1", + "~/cwd/rel2/2", + "~/cwd/rel/1", "/path/1", "/path/2", - "~/foo/1", - "~/cwd/rel/1", - "~/cwd/rel2/2", ] "# ); diff --git a/src/config/mod.rs b/src/config/mod.rs index 0e0a8e23d..76c8d19f1 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -585,6 +585,7 @@ impl Config { let entries = self .config_files .iter() + .rev() .map(|(source, cf)| { cf.env_entries() .map(|ee| ee.into_iter().map(|e| (e, source.clone())))