summaryrefslogtreecommitdiff
path: root/src/workspace.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-17 01:41:17 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-17 01:41:17 +0300
commitf7fe0f203e0f349df33819aab239c0aade016f79 (patch)
tree51540d4a040a1a2d32ecf73c5c2d9277a7d4efef /src/workspace.rs
parent3ecacfddae86d603bfd0d1a0c01602b1d34b1df3 (diff)
fix: polish terminal-core agent semantics
Diffstat (limited to 'src/workspace.rs')
-rw-r--r--src/workspace.rs63
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]