diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-30 23:58:15 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-30 23:58:34 +0300 |
| commit | fc4e1bbf6b0fa2ec37445a5b72356514c7c6be6a (patch) | |
| tree | 93af04af44a4dcc062a7886c51d70641c1903144 /src/workspace.rs | |
| parent | d477341e6af816ff4396042b084a0378ef437b4a (diff) | |
perf: reduce sidebar git polling overhead
refs #353
Diffstat (limited to 'src/workspace.rs')
| -rw-r--r-- | src/workspace.rs | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/src/workspace.rs b/src/workspace.rs index 4bab61a7..8a660b02 100644 --- a/src/workspace.rs +++ b/src/workspace.rs @@ -19,9 +19,13 @@ mod aggregate; mod git; mod tab; +#[cfg(test)] use self::git::git_ahead_behind; pub use self::{ - git::{derive_label_from_cwd, git_branch, git_space_metadata, GitSpaceMetadata}, + git::{ + derive_label_from_cwd, git_branch, git_space_metadata, git_status_cache_key, + GitSpaceMetadata, GitStatusCacheEntry, + }, tab::Tab, }; @@ -43,6 +47,29 @@ pub struct WorkspaceGitStatus { pub space: Option<GitSpaceMetadata>, } +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct WorkspaceGitStatusSnapshot { + pub branch: Option<String>, + pub ahead_behind: Option<(usize, usize)>, + pub space: Option<GitSpaceMetadata>, +} + +impl WorkspaceGitStatusSnapshot { + pub fn into_workspace_status( + self, + workspace_id: String, + resolved_identity_cwd: PathBuf, + ) -> WorkspaceGitStatus { + WorkspaceGitStatus { + workspace_id, + resolved_identity_cwd, + branch: self.branch, + ahead_behind: self.ahead_behind, + space: self.space, + } + } +} + static NEXT_WORKSPACE_ID: AtomicU64 = AtomicU64::new(1); pub(crate) fn generate_workspace_id() -> String { @@ -608,17 +635,11 @@ impl Workspace { self.cached_git_space = cwd.as_deref().and_then(git_space_metadata); } - pub fn git_status_for_cwd( - workspace_id: String, - resolved_identity_cwd: PathBuf, - ) -> WorkspaceGitStatus { - WorkspaceGitStatus { - branch: git_branch(&resolved_identity_cwd), - ahead_behind: git_ahead_behind(&resolved_identity_cwd), - space: git_space_metadata(&resolved_identity_cwd), - workspace_id, - resolved_identity_cwd, - } + pub fn git_status_snapshot_for_cwd_with_cache( + resolved_identity_cwd: &std::path::Path, + cached: Option<&GitStatusCacheEntry>, + ) -> (WorkspaceGitStatusSnapshot, Option<GitStatusCacheEntry>) { + self::git::git_status_snapshot_for_cwd(resolved_identity_cwd, cached) } pub fn find_tab_index_for_pane(&self, pane_id: PaneId) -> Option<usize> { |
