diff --git a/src/executor/helpers/run_with_env.rs b/src/executor/helpers/run_with_env.rs index 6af3eb88..97ee236e 100644 --- a/src/executor/helpers/run_with_env.rs +++ b/src/executor/helpers/run_with_env.rs @@ -61,7 +61,7 @@ fn create_env_file(extra_env: &HashMap) -> Result let system_env = get_exported_system_env()?; let base_injected_env = extra_env .iter() - .map(|(k, v)| format!("export {k}='{v}'")) + .map(|(k, v)| format!("export {k}='{}'", v.replace('\'', r"'\''"))) .collect::>() .join("\n"); @@ -70,3 +70,30 @@ fn create_env_file(extra_env: &HashMap) -> Result env_file.write_all(format!("{system_env}\n{base_injected_env}").as_bytes())?; Ok(env_file) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_env_file_preserves_single_quotes() { + let value = "/tmp/it's a profile folder"; + let extra_env = HashMap::from([("CODSPEED_TEST_VALUE".to_string(), value.to_string())]); + let env_file = create_env_file(&extra_env).unwrap(); + + let output = Command::new("bash") + .arg("-c") + .arg("source \"$1\" && printf %s \"$CODSPEED_TEST_VALUE\"") + .arg("bash") + .arg(env_file.path()) + .output() + .unwrap(); + + assert!( + output.status.success(), + "{}", + String::from_utf8_lossy(&output.stderr) + ); + assert_eq!(String::from_utf8_lossy(&output.stdout), value); + } +}