use std::path::PathBuf;
use std::process::Command;
use std::sync::atomic::{AtomicU64, Ordering};
pub struct IsolatedHome {
path: PathBuf,
}
impl IsolatedHome {
pub fn new(label: &str) -> Self {
static COUNTER: AtomicU64 = AtomicU64::new(0);
let seq = COUNTER.fetch_add(1, Ordering::Relaxed);
let path =
std::env::temp_dir().join(format!("roteiro-{label}-home-{}-{seq}", std::process::id()));
std::fs::remove_dir_all(&path).ok();
std::fs::create_dir_all(&path).expect("mkdir isolated config home");
Self { path }
}
pub fn apply<'c>(&self, cmd: &'c mut Command) -> &'c mut Command {
cmd.env("ROTEIRO_HOME", &self.path)
.env("HOME", &self.path)
.env("USERPROFILE", &self.path)
}
}
impl Drop for IsolatedHome {
fn drop(&mut self) {
std::fs::remove_dir_all(&self.path).ok();
}
}