aboutsummaryrefslogtreecommitdiff
path: root/src/persist/restore.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-22 02:21:12 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-22 02:23:35 +0300
commit0148c1379b76c5c0a9d05588c07dcb06ec32f93f (patch)
tree554766d959c738ca2aa433c3d4b4a7de25568008 /src/persist/restore.rs
parenta9ff4012bdca0dbdbc77bc6e53a430689fc899be (diff)
feat: add git worktree workspace management
refs #137
Diffstat (limited to 'src/persist/restore.rs')
-rw-r--r--src/persist/restore.rs31
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);
+ }
}