diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-22 02:21:12 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-22 02:23:35 +0300 |
| commit | 0148c1379b76c5c0a9d05588c07dcb06ec32f93f (patch) | |
| tree | 554766d959c738ca2aa433c3d4b4a7de25568008 /src/persist/restore.rs | |
| parent | a9ff4012bdca0dbdbc77bc6e53a430689fc899be (diff) | |
feat: add git worktree workspace management
refs #137
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); + } } |
