diff options
Diffstat (limited to 'src/integration/env.rs')
| -rw-r--r-- | src/integration/env.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/integration/env.rs b/src/integration/env.rs index c4ee1c34..48320c72 100644 --- a/src/integration/env.rs +++ b/src/integration/env.rs @@ -127,6 +127,14 @@ pub(crate) fn opencode_dir() -> io::Result<PathBuf> { Ok(home_dir()?.join(".config/opencode")) } +pub(crate) fn opencode_state_dir() -> io::Result<PathBuf> { + if let Some(value) = std::env::var_os("XDG_STATE_HOME").filter(|value| !value.is_empty()) { + return expand_tilde_path(PathBuf::from(value)).map(|path| path.join("opencode")); + } + + Ok(home_dir()?.join(".local/state/opencode")) +} + pub(crate) fn kilo_dir() -> io::Result<PathBuf> { Ok(home_dir()?.join(".config/kilo")) } @@ -248,3 +256,34 @@ pub(crate) fn integration_env_lock() -> IntegrationEnvLock { appdata: std::env::var_os("APPDATA"), } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn opencode_state_dir_defaults_to_local_state() { + let _lock = integration_env_lock(); + let original = std::env::var_os("XDG_STATE_HOME"); + std::env::remove_var("XDG_STATE_HOME"); + let expected = home_dir().unwrap().join(".local/state/opencode"); + assert_eq!(opencode_state_dir().unwrap(), expected); + match original { + Some(value) => std::env::set_var("XDG_STATE_HOME", value), + None => std::env::remove_var("XDG_STATE_HOME"), + } + } + + #[test] + fn opencode_state_dir_honors_xdg_state_home() { + let _lock = integration_env_lock(); + let original = std::env::var_os("XDG_STATE_HOME"); + let xdg = std::env::temp_dir().join("herdr-xdg-state"); + std::env::set_var("XDG_STATE_HOME", &xdg); + assert_eq!(opencode_state_dir().unwrap(), xdg.join("opencode")); + match original { + Some(value) => std::env::set_var("XDG_STATE_HOME", value), + None => std::env::remove_var("XDG_STATE_HOME"), + } + } +} |
