summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-29 09:47:53 -0300
committerGabriel Schneider <[email protected]>2026-10-01 00:12:16 -0300
commit6e2ed2e057ba95b3a86186c255d1965e1861bdf7 (patch)
tree5438ce5465dfa24ca680a94241150f959d1cf3ec
parent7a18df8aab1638622ab93fd3203930399c680544 (diff)
downloadpardes-6e2ed2e057ba95b3a86186c255d1965e1861bdf7.tar.gz
pardes-6e2ed2e057ba95b3a86186c255d1965e1861bdf7.zip
A shell started again by pty/ctl exec is guarded against the rename flap as a new one is
The guard that keeps a shell from taking this process's directory before its chdir lasted only until the first shell spoke; a shell started again in the same pane (pty/ctl exec) was asked with the old shell's word still standing. A spawn resets it. fs.py's naming test restarts one too. Co-Authored-By: Claude Opus 5.5 <[email protected]>
-rw-r--r--src/pardes.zig3
-rw-r--r--test/fs.py3
2 files changed, 6 insertions, 0 deletions
diff --git a/src/pardes.zig b/src/pardes.zig
index 27cbf383..26c9246a 100644
--- a/src/pardes.zig
+++ b/src/pardes.zig
@@ -4826,6 +4826,9 @@ pub const Pardes = struct {
/// A child for pane `id` in `cwd`: a directory up to PATH_MAX, the ones
/// past the effect's inline buffer kept here for perform to give.
pub fn emitSpawn(p: *Pardes, id: usize, serial: u32, cwd: []const u8) void {
+ // A new shell has not said anything yet (setCwd's guard), whatever
+ // the one it replaces said.
+ if (p.panes[id]) |pane| pane.shell_spoke = false;
if (p.spawn_dirs[id]) |old| p.gpa.free(old);
p.spawn_dirs[id] = null;
if (cwd.len > effect_path_cap) p.spawn_dirs[id] = p.gpa.dupe(u8, cwd) catch null;
diff --git a/test/fs.py b/test/fs.py
index ae9538cc..3c10c53b 100644
--- a/test/fs.py
+++ b/test/fs.py
@@ -508,6 +508,9 @@ def new_terminals_named_once(binary):
client.write('/pane/1/ctl', b'Tty fish\n')
made += [s for s in (int(row.split()[0]) for row in client.read('/index').splitlines()) if s not in before]
time.sleep(1.5) # their shells start and say where they are
+ # A shell started again by pty/ctl exec: named as it was.
+ client.write(f'/pane/{made[0]}/pty/ctl', b'exec\n')
+ time.sleep(1.5)
log = client.read('/log').decode()
for serial in made:
assert f'\nrename {serial} ' not in '\n' + log, (serial, log)