From d9d6f042dfac8802ae17aa5c6fb2e6d21321fced Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:29:57 -0600 Subject: [PATCH] fix: use config_root for env._.source Fixes #2335 --- src/backend/asdf.rs | 3 ++- src/config/config_file/mod.rs | 20 ++++++++++++++------ src/config/env_directive.rs | 11 ++++------- src/env_diff.rs | 3 ++- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/backend/asdf.rs b/src/backend/asdf.rs index 2c519544c5..84f2de2929 100644 --- a/src/backend/asdf.rs +++ b/src/backend/asdf.rs @@ -142,7 +142,8 @@ impl AsdfBackend { sm.prepend_path(p); } let script = sm.get_script_path(&ExecEnv); - let ed = EnvDiff::from_bash_script(&script, &sm.env)?; + let dir = dirs::CWD.clone().unwrap_or_default(); + let ed = EnvDiff::from_bash_script(&script, &dir, &sm.env)?; let env = ed .to_patches() .into_iter() diff --git a/src/config/config_file/mod.rs b/src/config/config_file/mod.rs index d5d3ab6e28..5c48181f78 100644 --- a/src/config/config_file/mod.rs +++ b/src/config/config_file/mod.rs @@ -18,7 +18,7 @@ use tool_versions::ToolVersions; use crate::cli::args::{BackendArg, ToolArg}; use crate::config::config_file::mise_toml::MiseToml; use crate::config::env_directive::EnvDirective; -use crate::config::{settings, AliasMap, Settings, SETTINGS}; +use crate::config::{is_global_config, settings, AliasMap, Settings, SETTINGS}; use crate::errors::Error::UntrustedConfig; use crate::file::display_path; use crate::hash::hash_to_str; @@ -232,9 +232,9 @@ pub fn parse(path: &Path) -> Result> { } } -pub fn config_trust_root(path: &Path) -> PathBuf { - if settings::is_loaded() && SETTINGS.paranoid { - return path.to_path_buf(); +pub fn config_root(path: &Path) -> PathBuf { + if is_global_config(path) { + return env::HOME.to_path_buf(); } let path = path .absolutize() @@ -245,7 +245,7 @@ pub fn config_trust_root(path: &Path) -> PathBuf { .map(|c| c.as_os_str().to_string_lossy().to_string()) .collect::>(); const EMPTY: &str = ""; - // let filename = parts.last().map(|p| p.as_str()).unwrap_or(EMPTY); + let filename = parts.last().map(|p| p.as_str()).unwrap_or(EMPTY); let parent = parts .get(parts.len() - 2) .map(|p| p.as_str()) @@ -260,7 +260,7 @@ pub fn config_trust_root(path: &Path) -> PathBuf { let is_mise_dir = |d: &str| d == "mise" || d == ".mise"; if parent == "conf.d" && is_mise_dir(grandparent) { grandparent_path() - } else if is_mise_dir(parent) { + } else if is_mise_dir(parent) && filename == "config.toml" { if grandparent == ".config" { grandparent_path() } else { @@ -271,6 +271,14 @@ pub fn config_trust_root(path: &Path) -> PathBuf { } } +pub fn config_trust_root(path: &Path) -> PathBuf { + if settings::is_loaded() && SETTINGS.paranoid { + path.to_path_buf() + } else { + config_root(path) + } +} + pub fn trust_check(path: &Path) -> eyre::Result<()> { static MUTEX: Mutex<()> = Mutex::new(()); let _lock = MUTEX.lock().unwrap(); // Prevent multiple checks at once so we don't prompt multiple times for the same path diff --git a/src/config/env_directive.rs b/src/config/env_directive.rs index 3675cab7a4..9a0d9babb1 100644 --- a/src/config/env_directive.rs +++ b/src/config/env_directive.rs @@ -9,7 +9,7 @@ use indexmap::IndexMap; use serde::{Deserialize, Deserializer}; use crate::cmd::CmdLineRunner; -use crate::config::config_file::trust_check; +use crate::config::config_file::{config_root, trust_check}; use crate::config::{Config, SETTINGS}; use crate::env::PATH_KEY; use crate::env_diff::{EnvDiff, EnvDiffOperation}; @@ -164,11 +164,7 @@ impl EnvResults { // &directive, // &source // ); - let config_root = source - .parent() - .map(Path::to_path_buf) - .or_else(|| dirs::CWD.clone()) - .unwrap_or_default(); + let config_root = config_root(&source); ctx.insert("cwd", &*dirs::CWD); ctx.insert("config_root", &config_root); let env_vars = env @@ -237,7 +233,8 @@ impl EnvResults { { r.env_scripts.push(p.clone()); let env_diff = - EnvDiff::from_bash_script(&p, env_vars.clone()).unwrap_or_default(); + EnvDiff::from_bash_script(&p, &config_root, env_vars.clone()) + .unwrap_or_default(); for p in env_diff.to_patches() { match p { EnvDiffOperation::Add(k, v) diff --git a/src/env_diff.rs b/src/env_diff.rs index 9a8c4f9726..ff651e7c76 100644 --- a/src/env_diff.rs +++ b/src/env_diff.rs @@ -58,7 +58,7 @@ impl EnvDiff { diff } - pub fn from_bash_script(script: &Path, env: T) -> Result + pub fn from_bash_script(script: &Path, dir: &Path, env: T) -> Result where T: IntoIterator, U: Into, @@ -75,6 +75,7 @@ impl EnvDiff { export -p ", script = script.display()} ) + .dir(dir) .full_env(&env) .read()?; let env: HashMap = env