From 86f596596475e45e5ee5dd10d5117a372476ceb4 Mon Sep 17 00:00:00 2001 From: alexion Date: Thu, 17 Sep 2026 09:49:50 -0400 Subject: [PATCH] refactor(monorepo): expose one workspace path API --- src/monorepo/workspace.rs | 4 +- src/monorepo/workspace_test.rs | 69 ++++++++++++++++++++++++++++++---- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/src/monorepo/workspace.rs b/src/monorepo/workspace.rs index 9d928da..1a81a32 100644 --- a/src/monorepo/workspace.rs +++ b/src/monorepo/workspace.rs @@ -1,13 +1,13 @@ use std::path::PathBuf; pub fn resolve_workspace_path(path: PathBuf) -> PathBuf { - resolve_workspace_path_from( + resolve_workspace_path_impl( path, std::env::var_os("BUILD_WORKSPACE_DIRECTORY").map(PathBuf::from), ) } -pub fn resolve_workspace_path_from(path: PathBuf, workspace: Option) -> PathBuf { +fn resolve_workspace_path_impl(path: PathBuf, workspace: Option) -> PathBuf { if path.is_absolute() { return path; } diff --git a/src/monorepo/workspace_test.rs b/src/monorepo/workspace_test.rs index efd9686..d1b6462 100644 --- a/src/monorepo/workspace_test.rs +++ b/src/monorepo/workspace_test.rs @@ -1,31 +1,86 @@ +use std::ffi::OsString; use std::path::PathBuf; +use std::sync::Mutex; -use monorepo::workspace::resolve_workspace_path_from; +use monorepo::workspace::resolve_workspace_path; + +static ENV_LOCK: Mutex<()> = Mutex::new(()); + +const BUILD_WORKSPACE_DIRECTORY: &str = "BUILD_WORKSPACE_DIRECTORY"; + +struct EnvRestore { + key: &'static str, + value: Option, +} + +impl EnvRestore { + fn set(key: &'static str, value: &str) -> Self { + let restore = Self { + key, + value: std::env::var_os(key), + }; + + unsafe { + std::env::set_var(key, value); + } + + restore + } + + fn remove(key: &'static str) -> Self { + let restore = Self { + key, + value: std::env::var_os(key), + }; + + unsafe { + std::env::remove_var(key); + } + + restore + } +} + +impl Drop for EnvRestore { + fn drop(&mut self) { + unsafe { + if let Some(value) = &self.value { + std::env::set_var(self.key, value); + } else { + std::env::remove_var(self.key); + } + } + } +} #[test] fn absolute_path_returns_unchanged_path() { + let _lock = ENV_LOCK.lock().unwrap(); + let _workspace = EnvRestore::set(BUILD_WORKSPACE_DIRECTORY, "/workspace"); let path = PathBuf::from("/tmp/output"); - let resolved = resolve_workspace_path_from(path.clone(), Some(PathBuf::from("/workspace"))); + let resolved = resolve_workspace_path(path.clone()); assert_eq!(resolved, path); } #[test] fn relative_path_joins_workspace_path() { - let resolved = resolve_workspace_path_from( - PathBuf::from("output/graph"), - Some(PathBuf::from("/workspace")), - ); + let _lock = ENV_LOCK.lock().unwrap(); + let _workspace = EnvRestore::set(BUILD_WORKSPACE_DIRECTORY, "/workspace"); + + let resolved = resolve_workspace_path(PathBuf::from("output/graph")); assert_eq!(resolved, PathBuf::from("/workspace/output/graph")); } #[test] fn relative_path_without_workspace_returns_unchanged_path() { + let _lock = ENV_LOCK.lock().unwrap(); + let _workspace = EnvRestore::remove(BUILD_WORKSPACE_DIRECTORY); let path = PathBuf::from("output/graph"); - let resolved = resolve_workspace_path_from(path.clone(), None); + let resolved = resolve_workspace_path(path.clone()); assert_eq!(resolved, path); }