diff options
Diffstat (limited to 'src/persist/restore.rs')
| -rw-r--r-- | src/persist/restore.rs | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/persist/restore.rs b/src/persist/restore.rs index f558761d..ebad2f16 100644 --- a/src/persist/restore.rs +++ b/src/persist/restore.rs @@ -99,6 +99,8 @@ fn restore_workspace( return None; } + let worktree_space = restored_worktree_space_membership(snap.worktree_space.clone()); + Some(( Workspace { id: snap @@ -107,8 +109,10 @@ fn restore_workspace( .unwrap_or_else(crate::workspace::generate_workspace_id), custom_name: snap.custom_name.clone(), identity_cwd: snap.identity_cwd.clone(), - cached_git_branch: None, + cached_git_branch: crate::workspace::git_branch(&snap.identity_cwd), cached_git_ahead_behind: None, + cached_git_space: crate::workspace::git_space_metadata(&snap.identity_cwd), + worktree_space, public_pane_numbers, next_public_pane_number, active_tab: snap.active_tab.min(tabs.len().saturating_sub(1)), @@ -121,6 +125,16 @@ fn restore_workspace( )) } +fn restored_worktree_space_membership( + space: Option<crate::workspace::WorktreeSpaceMembership>, +) -> Option<crate::workspace::WorktreeSpaceMembership> { + space.filter(|space| { + space.checkout_path.exists() + && crate::workspace::git_space_metadata(&space.checkout_path) + .is_some_and(|current| current.key == space.key) + }) +} + fn restore_tab( snap: &TabSnapshot, number: usize, @@ -407,4 +421,19 @@ mod tests { Some(first) ); } + + #[test] + fn restored_worktree_space_membership_drops_missing_checkout() { + let missing = + std::env::temp_dir().join(format!("herdr-missing-worktree-{}", std::process::id())); + let membership = crate::workspace::WorktreeSpaceMembership { + key: "repo-key".into(), + label: "herdr".into(), + repo_root: missing.join("repo"), + checkout_path: missing.join("checkout"), + is_linked_worktree: true, + }; + + assert_eq!(restored_worktree_space_membership(Some(membership)), None); + } } |
