aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pane.rs12
-rw-r--r--tests/api_ping.rs4
2 files changed, 9 insertions, 7 deletions
diff --git a/src/pane.rs b/src/pane.rs
index bd3f7ffd..7340629c 100644
--- a/src/pane.rs
+++ b/src/pane.rs
@@ -3013,12 +3013,12 @@ impl PaneRuntime {
.or_else(|| crate::platform::foreground_process_group_id(pid));
let leader_cwd = foreground_pgid.and_then(absolute_process_cwd);
- if leader_cwd.as_ref() == shell_cwd.as_ref() {
- foreground_member_cwd_different_from_shell(pid, shell_cwd.as_ref()).or(leader_cwd)
- } else {
- leader_cwd
- .or_else(|| foreground_member_cwd_different_from_shell(pid, shell_cwd.as_ref()))
- }
+ // The group leader's cwd is authoritative (issue #3270): a helper
+ // process that chdirs elsewhere inside the same foreground group
+ // must not override it. Scan other members only when the leader's
+ // cwd cannot be read at all.
+ leader_cwd
+ .or_else(|| foreground_member_cwd_different_from_shell(pid, shell_cwd.as_ref()))
}
#[cfg(not(unix))]
diff --git a/tests/api_ping.rs b/tests/api_ping.rs
index d6b253fb..0a52e6a7 100644
--- a/tests/api_ping.rs
+++ b/tests/api_ping.rs
@@ -969,9 +969,11 @@ fn new_terminal_cwd_follow_ignores_nonleader_group_member_cwd() {
),
);
assert_eq!(pane["result"]["pane"]["cwd"], base.display().to_string());
+ // Regression for issue #3270: the foreground group leader's cwd is
+ // authoritative; the backgrounded helper's chdir must not override it.
assert_eq!(
pane["result"]["pane"]["foreground_cwd"],
- helper_cwd.display().to_string()
+ base.display().to_string()
);
let split = send_request(