diff --git a/crates/pod-store/src/lib.rs b/crates/pod-store/src/lib.rs index 25422af7..e757120c 100644 --- a/crates/pod-store/src/lib.rs +++ b/crates/pod-store/src/lib.rs @@ -165,16 +165,30 @@ pub trait PodMetadataStore: Send + Sync { Ok(metadata) } - /// Set the active pointer while preserving spawned children and manifest snapshot. + /// Set the active pointer while preserving spawned children, workspace ownership, and manifest snapshot. fn set_active( &self, pod_name: &str, active: Option, resolved_manifest_snapshot: Option, + ) -> Result { + self.set_active_with_workspace_root(pod_name, active, resolved_manifest_snapshot, None) + } + + /// Set the active pointer and workspace ownership while preserving unrelated fields. + fn set_active_with_workspace_root( + &self, + pod_name: &str, + active: Option, + resolved_manifest_snapshot: Option, + workspace_root: Option, ) -> Result { self.update_by_name(pod_name, |metadata| { metadata.active = active; metadata.resolved_manifest_snapshot = resolved_manifest_snapshot; + if let Some(workspace_root) = workspace_root { + metadata.workspace_root = Some(workspace_root); + } }) } diff --git a/crates/pod/src/pod.rs b/crates/pod/src/pod.rs index abeece58..9c4da1a8 100644 --- a/crates/pod/src/pod.rs +++ b/crates/pod/src/pod.rs @@ -72,10 +72,11 @@ where let store = store.clone(); Arc::new(move |metadata| { store - .set_active( + .set_active_with_workspace_root( &metadata.pod_name, metadata.active, metadata.resolved_manifest_snapshot, + metadata.workspace_root, ) .map(|_| ()) }) @@ -5236,6 +5237,24 @@ permission = "write" mod pod_metadata_restore_manifest_tests { use super::*; + #[test] + fn metadata_writer_persists_workspace_root_through_store_update() { + let temp = tempfile::tempdir().unwrap(); + let store = pod_store::FsPodStore::new(temp.path().join("pods")).unwrap(); + let workspace_root = temp.path().join("workspace-root"); + std::fs::create_dir_all(&workspace_root).unwrap(); + let writer = pod_metadata_writer_for_store(&store); + + writer(PodMetadata::new("runtime-pod", None).with_workspace_root(workspace_root.clone())) + .unwrap(); + + let stored = store.read_by_name("runtime-pod").unwrap().unwrap(); + assert_eq!( + stored.workspace_root.as_deref(), + Some(workspace_root.as_path()) + ); + } + #[test] fn snapshot_preserves_saved_scope_over_current_manifest() { let saved = PodManifest::from_toml(