aboutsummaryrefslogtreecommitdiff
path: root/src/workspace.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-30 23:58:15 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-30 23:58:34 +0300
commitfc4e1bbf6b0fa2ec37445a5b72356514c7c6be6a (patch)
tree93af04af44a4dcc062a7886c51d70641c1903144 /src/workspace.rs
parentd477341e6af816ff4396042b084a0378ef437b4a (diff)
perf: reduce sidebar git polling overhead
refs #353
Diffstat (limited to 'src/workspace.rs')
-rw-r--r--src/workspace.rs45
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> {