use std::sync::Mutex;
static PATH_GUARD: Mutex<()> = Mutex::new(());
pub(crate) fn path_lock() -> &'static Mutex<()> {
&PATH_GUARD
}
pub(crate) fn with_prepend_path<T>(prepend: &std::path::Path, f: impl FnOnce() -> T) -> T {
let _guard = PATH_GUARD.lock().unwrap();
let original = std::env::var("PATH").unwrap_or_default();
let new_path = format!("{}:{}", prepend.display(), original);
struct PathGuard(String);
impl Drop for PathGuard {
fn drop(&mut self) {
unsafe { std::env::set_var("PATH", &self.0) };
}
}
let _path_guard = PathGuard(original);
unsafe { std::env::set_var("PATH", &new_path) };
f()
}
pub(crate) fn with_path<T>(path_value: &str, f: impl FnOnce() -> T) -> T {
let _guard = PATH_GUARD.lock().unwrap();
let original = std::env::var("PATH").unwrap_or_default();
struct PathGuard(String);
impl Drop for PathGuard {
fn drop(&mut self) {
unsafe { std::env::set_var("PATH", &self.0) };
}
}
let _path_guard = PathGuard(original);
unsafe { std::env::set_var("PATH", path_value) };
f()
}
pub(crate) fn portable_abs_path(label: impl AsRef<std::path::Path>) -> std::path::PathBuf {
std::env::temp_dir().join("ralph-test-paths").join(label)
}