pod: persist metadata workspace root

This commit is contained in:
Keisuke Hirata 2026-06-19 00:28:19 +09:00
parent 3b634d66ca
commit 160c96ad1e
No known key found for this signature in database
2 changed files with 35 additions and 2 deletions

View File

@ -165,16 +165,30 @@ pub trait PodMetadataStore: Send + Sync {
Ok(metadata) 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( fn set_active(
&self, &self,
pod_name: &str, pod_name: &str,
active: Option<PodActiveSegmentRef>, active: Option<PodActiveSegmentRef>,
resolved_manifest_snapshot: Option<serde_json::Value>, resolved_manifest_snapshot: Option<serde_json::Value>,
) -> Result<PodMetadata, PodStoreError> {
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<PodActiveSegmentRef>,
resolved_manifest_snapshot: Option<serde_json::Value>,
workspace_root: Option<PathBuf>,
) -> Result<PodMetadata, PodStoreError> { ) -> Result<PodMetadata, PodStoreError> {
self.update_by_name(pod_name, |metadata| { self.update_by_name(pod_name, |metadata| {
metadata.active = active; metadata.active = active;
metadata.resolved_manifest_snapshot = resolved_manifest_snapshot; metadata.resolved_manifest_snapshot = resolved_manifest_snapshot;
if let Some(workspace_root) = workspace_root {
metadata.workspace_root = Some(workspace_root);
}
}) })
} }

View File

@ -72,10 +72,11 @@ where
let store = store.clone(); let store = store.clone();
Arc::new(move |metadata| { Arc::new(move |metadata| {
store store
.set_active( .set_active_with_workspace_root(
&metadata.pod_name, &metadata.pod_name,
metadata.active, metadata.active,
metadata.resolved_manifest_snapshot, metadata.resolved_manifest_snapshot,
metadata.workspace_root,
) )
.map(|_| ()) .map(|_| ())
}) })
@ -5236,6 +5237,24 @@ permission = "write"
mod pod_metadata_restore_manifest_tests { mod pod_metadata_restore_manifest_tests {
use super::*; 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] #[test]
fn snapshot_preserves_saved_scope_over_current_manifest() { fn snapshot_preserves_saved_scope_over_current_manifest() {
let saved = PodManifest::from_toml( let saved = PodManifest::from_toml(