diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-17 01:41:17 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-17 01:41:17 +0300 |
| commit | f7fe0f203e0f349df33819aab239c0aade016f79 (patch) | |
| tree | 51540d4a040a1a2d32ecf73c5c2d9277a7d4efef /src/workspace.rs | |
| parent | 3ecacfddae86d603bfd0d1a0c01602b1d34b1df3 (diff) | |
fix: polish terminal-core agent semantics
Diffstat (limited to 'src/workspace.rs')
| -rw-r--r-- | src/workspace.rs | 63 |
1 files changed, 40 insertions, 23 deletions
diff --git a/src/workspace.rs b/src/workspace.rs index 1d8842c8..69a83d75 100644 --- a/src/workspace.rs +++ b/src/workspace.rs @@ -517,6 +517,17 @@ impl Workspace { Some(self.identity_cwd.clone()) } + pub fn resolved_identity_cwd_from( + &self, + terminals: &HashMap<TerminalId, TerminalState>, + terminal_runtimes: &HashMap<TerminalId, TerminalRuntime>, + ) -> Option<PathBuf> { + self.tabs + .first() + .and_then(|tab| tab.cwd_for_pane(tab.root_pane, terminals, terminal_runtimes)) + .or_else(|| Some(self.identity_cwd.clone())) + } + pub fn display_name(&self) -> String { if let Some(name) = &self.custom_name { return name.clone(); @@ -527,6 +538,20 @@ impl Workspace { .unwrap_or_else(|| "workspace".into()) } + pub fn display_name_from( + &self, + terminals: &HashMap<TerminalId, TerminalState>, + terminal_runtimes: &HashMap<TerminalId, TerminalRuntime>, + ) -> String { + if let Some(name) = &self.custom_name { + return name.clone(); + } + + self.resolved_identity_cwd_from(terminals, terminal_runtimes) + .map(|cwd| derive_label_from_cwd(&cwd)) + .unwrap_or_else(|| "workspace".into()) + } + pub fn branch(&self) -> Option<String> { self.cached_git_branch.clone() } @@ -535,11 +560,6 @@ impl Workspace { self.cached_git_ahead_behind } - pub fn refresh_git_branch(&mut self) { - let cwd = self.resolved_identity_cwd(); - self.cached_git_branch = cwd.as_deref().and_then(git_branch); - } - #[cfg(test)] pub fn refresh_git_ahead_behind(&mut self) { let cwd = self.resolved_identity_cwd(); @@ -719,26 +739,23 @@ mod tests { use super::*; #[test] - fn workspace_identity_uses_identity_cwd() { - let root = std::env::temp_dir().join(format!( - "herdr-workspace-identity-{}-{}", - std::process::id(), - std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_nanos() - )); - let identity_cwd = root.join("pion"); - std::fs::create_dir_all(identity_cwd.join(".git")).unwrap(); - + fn workspace_identity_follows_first_tab_root_pane_cwd() { let mut ws = Workspace::test_new("ignored"); ws.custom_name = None; - ws.identity_cwd = identity_cwd.clone(); - - assert_eq!(ws.display_name(), "pion"); - assert_eq!(ws.resolved_identity_cwd(), Some(identity_cwd)); - - std::fs::remove_dir_all(root).unwrap(); + let root_pane = ws.tabs[0].root_pane; + let terminal_id = ws.tabs[0].terminal_id(root_pane).unwrap().clone(); + let mut terminals = HashMap::new(); + terminals.insert( + terminal_id.clone(), + TerminalState::new(terminal_id, PathBuf::from("/herdr-test/pion")), + ); + let terminal_runtimes = HashMap::new(); + + assert_eq!(ws.display_name_from(&terminals, &terminal_runtimes), "pion"); + assert_eq!( + ws.resolved_identity_cwd_from(&terminals, &terminal_runtimes), + Some(PathBuf::from("/herdr-test/pion")) + ); } #[test] |
